我试图从文件中读取项目列表,然后将它们存储到矢量中。问题是我的代码是将最后一项添加到向量中两次,我不确定为什么即使程序已经到达结束它也会继续读取文件。
这是文本文件中的内容。 "橘子"当我显示向量的内容时,行会出现两次。
苹果 - 磅-10 2
橘子 - 磅-5 6
这是代码 //将列表内容读入文件
while (!inputFile.fail())
{
//Extract the line from the list
getline(inputFile,item_name,'-');
getline(inputFile,item_unit,'-');
inputFile >> item_amount;
inputFile >> item_price;
//Create an instance of the item object
Item New_Item(item_name, item_unit, item_amount,item_price);
//Push it to the list vector
list.push_back(New_Item);
}
//Close the file
inputFile.close();
答案 0 :(得分:2)
这是while (!infile.fail())
反模式的典型症状。
我为该类型定义了一个结构并重载operator>>
:
struct item {
std::string name;
std::string unit;
int amount;
int price;
};
std::istream &std::operator>>(std::istream &is, item &i) {
getline(is, i.name, '-');
getline(is, i.unit, '-');
is >> i.amount;
return is >> i.price;
}
通过这些定义,轻松读取数据边界:
std::ifstream inputFile("fileNameHere");
std::vector<New_Item> items { std::istream_iterator<Item>(inputFile),
std::istream_iterator<Item>() };
[我将其从list
更改为vector
,因为,你真的不想要list
。你可以改回来,但可能不应该改变。]
答案 1 :(得分:1)
问题是,在您尝试从文件中读取更多数据之前,不会设置“fail”标志。以下是解决此问题的快速方法:
for (;;) {
//Extract the line from the list
getline(inputFile,item_name,'-');
getline(inputFile,item_unit,'-');
inputFile >> item_amount;
inputFile >> item_price;
if (inputFile.fail()) break;
//Create an instance of the item object
Item New_Item(item_name, item_unit, item_amount,item_price);
//Push it to the list vector
list.push_back(New_Item);
}
如果这是一次学习练习,而你尚未学习>>
运算符,那么应该这样做。否则,operator>>
方法会更好。