Прочитайте файл.dat в C++, данные которого имеют тип Class, затем сохраните каждую строку в векторе типа Class

Допустим, у меня есть файл.dat numbers.dat который состоит из списка целых чисел, например:

1
44
2
5

и так далее.

Затем прочитать из этого файла.dat и поместить каждое число в вектор типа int, Я знаю что делать:

std::ifstream file("numbers.dat");
int x;
std::vector<int> integers;
while(file >> x)
{
    integers.push_back(x);
}
file.close

Теперь, если я хочу вывести каждое целое число, мне просто нужно зациклить вектор, делая cout каждый раз.

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

Eggs    Eg    1    1.2
Spam    Spm   2    1.5

и так далее.

Я создал класс под названием Food с полями name, symbol, number, а также costкоторые имеют тип string, string, int, а также double соответственно. Теперь, если я попробую так же, как и раньше, но с соответствующими изменениями:

std::ifstream file("food.dat");
Food f;     // the constructor for Food handles default values
std::vector<Food> vec;
while(file >> f)
{
    vec.push_back(f);
}
file.close;

Я получаю ошибку компилятора:

error: invalid operands to binary expression('std::ifstream' (aka 'basic_ifstream<char') and Food)
while (file >> f)

Поэтому я попробовал что-то еще, на этот раз я просто пытаюсь прочитать первую строку в файле, чтобы убедиться, что он работает.

std::ifstream file("food.dat");
Food f;
file >> f;
file.close();

Но это дает ту же ошибку компилятора, что и раньше. Я обнаружил, что фрагмент кода file >> f это та часть, на которую компилятор жалуется в обоих случаях.

Как я могу избежать этой ошибки и заставить код скомпилироваться? Мое намерение состоит в том, чтобы вывести каждый элемент вектора (я уже правильно перегрузил << оператор для обработки этого для переменных типа Food).

Должен ли я перегрузить оператор "получить от", >> для переменных типа Food для того, чтобы код компилировался?

1 ответ

Решение

Как я могу избежать этой ошибки и заставить код скомпилироваться?

Вам нужно определить функцию

std::istream& operator>>(std::istream& in, Food& f) { ... }

соответственно.

Например

std::istream& operator>>(std::istream& in, Food& f)
{
   return in >> f.name >> f.symbol >> f.number >> f.coset;
}
Другие вопросы по тегам