Чтение из текстового файла, лучший способ хранения данных C++

В основном у меня есть текстовый файл, который мне нужно прочитать значения, чтобы программа могла манипулировать ими.

Я использую C++, и я написал рабочий код, чтобы сказать, существует ли файл или нет.

Текстовый файл отформатирован так:

1    7
8    10
20   6
3    14
...

Значения слева - это значения X, а значения справа - значения Y. (Пространство посередине - вкладка) Как мне извлечь эти данные? скажем, чтобы передать их в класс, как это...

myVector(X,Y);

Кроме того, я думаю, прежде чем я смогу использовать его в классе, мне нужно попробовать TryParse, чтобы изменить его из строки в Int правильно? может ли C++ сделать это?

Спасибо!

2 ответа

Решение

Я бы написал что-то подобное на вашем месте. Обратите внимание, это всего лишь прототип кода, и он даже не был протестирован.

Основная идея состоит в том, чтобы читать дважды в строке, но с разными разделителями. Сначала вы должны прочитать с разделителем табуляции, а затем просто конец строки по умолчанию.

Вам нужно убедиться, что вы аккуратно вышли из цикла, когда у вас больше нечего читать, следовательно, разрывов, хотя второй может быть достаточно, если ваш файл "правильный".

Вы также должны будете убедиться, что преобразовали в правильный тип, который ожидает ваш векторный класс. Я предположил, что это int, но если это строка, вам не нужно преобразование, которое я положил на место.

#include <string>
#include <fstream>

using namespace std;

void yourFunction()
{
    ..
    ifstream myfile("myfile.txt");
    string xword, yword;
    while (1) {
        if (!getline(myfile, xword, '\t'))
            break;
        if (!getline(myfile, yword))
            break;
        myVector.push_back(stoi(xword), stoi(yword));
    }
    ...
}

Этот вид синтаксического анализа может быть выполнен в одной строке с boost.spirit:

qi::phrase_parse(begin, end, *(qi::int_ > qi::int_ > qi::eol), qi::ascii::blank, v);

Грамматика может быть прочитана как: "читать одно целое, затем одно целое, затем одно EOL (конец строки) (\n или \r\n, зависит от локали) столько раз, сколько возможно". Между целыми числами и EOL можно найти пустые символы (например, пробелы или символы табуляции).

Преимущества: вместо циклов std:: getline, код более понятен / лаконичен. spirit.qi дает вам более мощный контроль, и вам не нужны постоянные звонки. Недостатки: сборка зависит (не зависит) от spirit.qi, время компиляции.

#include <iostream>
#include <fstream>
#include <vector>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>

namespace spirit = boost::spirit;
namespace qi = spirit::qi;

int main(int argc, char **argv)
{
  std::ifstream in(argv[1], std::ios_base::in);

  std::string storage;
  in.unsetf(std::ios::skipws);
  spirit::istream_iterator begin(in), end;

  std::vector<std::pair<int, int> > v;
  qi::phrase_parse(begin, end, *(qi::int_ > qi::int_ > qi::eol), qi::ascii::blank, v);

  for(const auto& p : v)
    std::cout << p.first << "," << p.second << std::endl;

  return 0;
}
Другие вопросы по тегам