Прочитайте файл.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;
}