CodeWalk

fstream错误状态与eof/fail/bad/good判断

作者:苦行僧 · 2026-05-30 12:55

请解释 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);         // 回到文件开头