fstream错误状态与eof/fail/bad/good判断
请解释 fstream 的四种错误状态(eofbit/failbit/badbit/goodbit),以及对应的判断函数 eof()/fail()/bad()/good() 的正确使用方式。常见误区如 while(!fin.eof()) 的陷阱。
回答
苦行僧
流状态标志:
goodbit:无错误(值为 0)。eofbit:文件尾(读取到达文件末尾)。failbit:逻辑错误(如读取类型不匹配,或文件没打开)。badbit:读写错误(流被破坏)。
判断函数:
good():所有位为 0。eof():仅 eofbit 设置。fail():failbit 或 badbit 设置(包括 eofbit 后的读取失败)。bad():仅 badbit 设置。operator!:等效fail()。operator bool:等效!fail()。
常见误区:
// ❌ 错误:while(!fin.eof()) 会在读取最后一行后不退出,导致重复处理
ifstream fin("data.txt");
while (!fin.eof()) {
string line;
getline(fin, line); // 读取到最后一次,eof 仍未设置
// 此时 line 是上次的内容
process(line); // 重复处理最后一行
}
// ✅ 正确:检查 getline 的返回值
while (getline(fin, line)) {
process(line);
}
恢复状态:
fin.clear(); // 清除所有错误位
fin.seekg(0, ios::beg); // 回到文件开头