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

标签 c++ class vector fstream

假设我有一个名为 numbers.dat 的 .dat 文件它由一个整数列表组成,如下所示:

1
44
2
5

等等。

然后从这个 .dat 文件中读取并将每个数字放入 int 类型的 vector 中,我知道该怎么做:

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

现在,如果我想输出每个整数,我只需要遍历 vector ,执行 cout每次。

但就我而言,我有一个名为 food.dat 的 .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是编译器在这两种情况下都会提示的部分。

我怎样才能避免这个错误并使代码编译通过?我的意图是输出 vector 的每个元素(我已经正确地重载了​​ << 运算符来处理 Food 类型的变量)。

我是否应该重载“get from”运算符,>> Food 类型的变量以使代码编译?

最佳答案

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

关于c++ - 读取C++中数据类型为Class的.dat文件,然后将每一行存储在Class类型的vector中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48372581/

相关文章:

c++ - 这个函数会泄漏内存吗?

objective-c - 在 objective-c 中的两个 View Controller 之间共享对象

c++ - 处理 vector - cudaMemcpyDeviceToHost

c++ - 对 vector (vector::operator[] 和 vector::size())的只读访问是异步安全的吗?

c++ - 覆盖未调用的虚拟方法

c++ - 如何在 SFML 中找到矩形的坐标?

java - 多重继承之类的?

scala - 隐含的太多了!

c++ - 警告 : Variable cannot be bound (it either doesn't exist or has been optimized away)

python - 如何从继承字符串类型的新类访问字符串值