读取数据类型为 Class 的 C++ .dat 文件,然后将每一行存储在类型为 Class 的向量中

Read .dat file in C++ whose data is of type Class, then store each line in a vector of type Class

假设我有一个名为 numbers.dat 的 .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

但在我的例子中,我有一个名为 food.dat 的 .dat 文件,每行有多种数据类型,由制表符分隔,例如

Eggs    Eg    1    1.2
Spam    Spm   2    1.5

等等。

我创建了一个名为 Food 的 class,字段 namesymbolnumbercost 类型为 [ =26=、stringintdouble。现在,如果我像以前一样尝试,但进行适当的更改:

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 类型的变量重载 "get from" 运算符 >> 以使代码编译?

How can I avoid this error and make the code compile?

你需要定义一个函数

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;
}