C++使用while循环读取文件时出现无限循环问题排查求助
问题根因
无限循环由两个常见的C++文件读取误区共同导致:
while(!inFile.eof())本身逻辑错误:eof()只会在尝试读取内容、已经触碰文件末尾失败后才会返回真,先判断再读取的逻辑会导致最后一次读取失败后,仍会多执行一轮循环体- 混合使用
getline和>>运算符未做读取校验:>>读取完整数后会把行尾的换行符遗留在输入缓冲区,最后一轮读取完favNum之后,下一轮的getline会先读到空字符串,后续的inFile >> age读取失败会将流设置为fail状态,fail状态下所有读取操作都会直接失效,eof()永远不会返回真,最终进入死循环。
修复方案
将读取操作直接放到while的判断条件中,每一步读取成功才会进入循环体执行,修复后代码如下:
#include <iostream> #include <fstream> #include <cstdlib> #include <string> // 原代码遗漏string头文件,补充避免编译问题 using namespace std; int main() { string name; int age, favNum; ifstream inFile; inFile.open("Trial.txt"); if(inFile.fail()) { cout << "No Such File!" << endl; exit(100); } cout << "The names are: " << endl; // 任意一步读取失败就直接退出循环 while(getline(inFile, name) && (inFile >> age) && (inFile >> favNum)) { cout << name << endl; cout << age << endl; cout << favNum << endl; // 忽略行尾剩余的换行符 inFile.ignore(100, '\n'); } inFile.close(); return 0; }
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

