C++数组转vector后文件读取循环无法终止问题求助
解决C++文件读取无限循环问题
嘿,我一眼就看出你踩了C++文件读取里两个超级常见的坑,这才导致循环停不下来!咱们一步步拆解问题,再给你修复方案:
问题根源分析
1. while(!iFile.eof())的致命逻辑错误
很多新手都会用这个判断,但它的逻辑完全反了:eof()只有在尝试读取超出文件末尾时才会被置为true。也就是说,当文件最后一次读取成功后,eof还是false,循环会强行再执行一次——这时候读取操作会失败,但你依然把无效的临时变量塞进vector里,而且流会进入错误状态,后续所有读取都失败,但eof可能没触发(比如是fail状态),导致循环无限跑下去。
2. iFile.ignore()的误用
你用getline(iFile, nTemp)读取名字后,getline已经把换行符从流里丢弃了,这时候调用iFile.ignore()会直接吃掉下一个字符(也就是价格的第一个数字),导致后续的iFile >> pTemp读取失败,流直接进入错误状态。之后的所有读取操作全失败,但循环还在继续,不断往vector里塞垃圾数据,所以你看到size一直在涨。
修复后的代码方案
假设你的文件格式是每行一个名字,下一行价格,再下一行数量,我给你调整了读取逻辑,同时修复了循环判断问题:
#include <iostream> #include <fstream> #include <vector> #include <string> #include <limits> // 用于numeric_limits using namespace std; void readIn(ifstream &iFile, vector<string> &itemName, vector<double> &itemPrice, vector<double> &quantity) { string nTemp; double pTemp; int qTemp; // 把读取操作直接放在循环条件里,只要有一个读取失败就终止循环 while (getline(iFile, nTemp)) { // 先读取名字 // 读取价格,检查是否成功 if (!(iFile >> pTemp)) break; // 读取数量,检查是否成功 if (!(iFile >> qTemp)) break; // 处理数量后面的换行符,避免下一次getline读到空行 iFile.ignore(numeric_limits<streamsize>::max(), '\n'); // 所有读取都成功,再加入vector itemName.push_back(nTemp); itemPrice.push_back(pTemp); quantity.push_back(qTemp); cout << itemName.size() << " " << itemPrice.size() << " " << quantity.size() << endl; } } // 调用部分不用改 // readIn(appIn, appName, appPrice, appquantity); // readIn(drinkIn, drinkName, drinkPrice, driquantity); // readIn(entreeIn, entreeName, entreePrice, entquantity); // readIn(dessertIn, desName, desPrice, dessquantity);
如果你的文件格式是每行包含名字、价格、数量三个字段(比如可乐 3.5 10),那更推荐用逐行读取再解析的方式,避免换行符问题:
#include <sstream> // 用于istringstream void readIn(ifstream &iFile, vector<string> &itemName, vector<double> &itemPrice, vector<double> &quantity) { string line; while (getline(iFile, line)) { // 逐行读取 istringstream lineStream(line); string nTemp; double pTemp; int qTemp; // 从当前行解析三个字段,成功才加入vector if (lineStream >> nTemp >> pTemp >> qTemp) { itemName.push_back(nTemp); itemPrice.push_back(pTemp); quantity.push_back(qTemp); cout << itemName.size() << " " << itemPrice.size() << " " << quantity.size() << endl; } } }
关键总结
- 永远不要用
while(!iFile.eof())来控制文件读取循环,直接把读取操作放在循环条件里判断返回值才是正确姿势。 - 处理
getline和>>混用时,一定要注意换行符的处理,避免流读取混乱。 - 每次读取后都要检查流的状态,确保读取成功再处理数据。
内容的提问来源于stack exchange,提问作者adamp
相关产品推荐
相关产品推荐

