Member 13910987 Ответов: 2

C++ как читать из текстового файла и разбивать его на значения


Привет Ребята,

В C++ я пытался прочитать свой текстовый файл и сохранить его в переменных

в c# я смог это сделать, хотя как бы я это сделал в c++?

string path = System.IO.Directory.GetCurrentDirectory() + @"\Destiny2Data.txt";
            var files = File.ReadLines(path);
            

            foreach (var f in files)
            {
                if (f.StartsWith("XModifier"))
                {
                    string s = f.Replace("\"", "").Split('=')[1];
                    xTextbox.Text = s;
                }

                if (f.StartsWith("YModifier"))
                {
                    string s = f.Replace("\"", "").Split('=')[1];
                    yTextbox.Text = s;
                }

                if (f.StartsWith("Left Mouse Click"))
                {
                    string s = f.Replace("\"", "").Split('=')[1];
                    LeftMouseClick.Checked = Convert.ToBoolean(s);
                }

                if (f.StartsWith("Right Mouse Click"))
                {
                    string s = f.Replace("\"", "").Split('=')[1];
                    RightMouseClick.Checked = Convert.ToBoolean(s);
                }
                if (f.StartsWith("Red Health Bar"))
                {
                    string s = f.Replace("\"", "").Split('=')[1];
                    RedHealthBar.Checked = Convert.ToBoolean(s);
                }
                if (f.StartsWith("Yellow Health Bar"))
                {
                    string s = f.Replace("\"", "").Split('=')[1];
                    YellowHealthBar.Checked = Convert.ToBoolean(s);
                }


            }


Мой текущий текстовый документ выглядит следующим образом:

Цитата:
XModifier = 1
YModifier = 1
Щелчок Левой Кнопкой Мыши = False
Щелчок Правой Кнопкой Мыши = False
Красная Полоса Здоровья = Ложь
Желтая Полоса Здоровья = Ложь


Что я уже пробовал:

Попробовал это в c#

отлично работает

попробовал это в c++, хотя это было не то, что я искал

auto read_file(std::istream& in)
{
    using namespace std;
    map<string, vector<string>> values;
    string line;
    while(getline(in, line))
    {
        istringstream linein{ line };
        string key, value;
        if(!getline(linein, key, '#'))
            throw runtime_error{ "bad file format" };
        while(getline(linein, value, '#') && !value.empty())
            values[key].emplace_back(move(value));
    }
    return values;
}

Richard MacCutchan

У вас уже есть логика в вашем коде C#, так что просто следуйте ей и переводите каждый оператор в его эквивалент C++. Вы также можете упростить его, получив сначала измененную строку, а затем Протестировав начальное выражение.

2 Ответов

Рейтинг:
2

KarstenK

Используйте std::строка класс с его функциями, такими как сравнение, поиск и подстрока. См. ссылку для класса, функций и примера кода. ;-)


Рейтинг:
1

User 6901758

Вот пример чтения некоторых значений из такого файла. Проверки ошибок отсутствуют:

#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
#include <sstream>

int read_int(std::istream& input_stream)
{
	int n;
	input_stream >> n;
	return n;
}

bool read_bool(std::istream& input_stream)
{
	std::string value;
	bool b;
	input_stream >> value;
	std::transform(value.begin(), value.end(), value.begin(), ::tolower);
	std::istringstream{ std::move(value) } >> std::boolalpha >> b;
	return b;
}

int main()
{
	std::ifstream input_file("text.txt");
	std::string name;
	while (std::getline(input_file, name, '='))
	{
		if (name.compare(0, 3, "XMo") == 0)
			std::cout << read_int(input_file) << std::endl;
		else if (name.compare(0, 3, "YMo") == 0)
			std::cout << read_int(input_file) << std::endl;
		else if (name.compare(0, 4, "Left") == 0)
			std::cout << std::boolalpha << read_bool(input_file) << std::endl;
		else if (name.compare(0, 5, "Right") == 0)
			std::cout << std::boolalpha << read_bool(input_file) << std::endl;
		else if (name.compare(0, 3, "Red") == 0)
			std::cout << std::boolalpha << read_bool(input_file) << std::endl;

		input_file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
	}

	input_file.close();
	std::cin.get();
    return 0;
}


Member 13910987

Возвращает as -858993460

Есть идеи?

[no name]

Что возвращает этот код? Вы пробовали пошаговую отладку? На каком шаге происходит ошибка?