void initializeVectorFromFile(vector<SInventory> & inven){
ifstream initData("inventoryData.txt");
if(!initData){
cout << "File could not be accessed! Press any key to terminate program...";
_getch();
exit(1);
}
while(!initData.eof()){
SInventory item;
initData >> item.itemID;
getline(initData,item.itemName);
initData >> item.pOrdered
>> item.menufPrice
>> item.sellingPrice;
item.pInStore = item.pOrdered;
item.pSold = 0;
inven.push_back(item);
cout << item.itemID << endl;
}
cout << "File Read Success!" << endl;
initData.close();
}
我正在读取的.txt
文件包含按以下顺序结构化的数据:
int
string
int double double
while-循环最后一行中的输出作为文件中的第一个 itemID 重复。initData
流不会读取.txt
文件中的后续条目。
1111
1111
1111
1111
1111
...
永远不要
使用while (!initData.eof())
。这几乎是一个有保证的错误。
我将从代码开始,从文件中读取单个SInventor
项:
std::istream &operator>>(std::istream &initData, SInventor &item) {
initData >> item.itemID;
getline(initData,item.itemName);
initData >> item.pOrdered
>> item.menufPrice
>> item.sellingPrice;
item.pInStore = item.pOrdered;
item.pSold = 0;
return initData;
}
有了这个,最简单的方法是不带函数的其余部分,直接初始化向量:
std::ifstream infile("yourfile.txt");
std::vector<SInventor> inven((std::istream_iterator<SInventor>(infile)),
std::istream_iterator<SInventor>());
没有循环,没有 EOF 的混乱测试等,只是一个从一对迭代器初始化的向量。
您可以将while循环更改为
SInventory item;
while(initData >> item.itemID){
...
或跳过 while 循环末尾的空格
ws(initData);
或者定义一个operator>>(istream&, SInventory &)
然后只是做
SInventory item;
while(initData >> item){
inven.push_back(item);
}