如何判断std::fstream读取std::string失败的具体原因?
区分std::fstream读取时触发fail+eof的三种场景
当用std::getline()或operator>>读取std::string后,流同时满足stream.fail()和stream.eof()时,可按以下步骤区分三种场景:
1. 判断流是否已关闭
直接调用流的is_open()成员函数:
if (!stream.is_open()) { // 场景3:流已关闭 }
2. 区分流为空和读取到最后一行
在流已打开的前提下,通过读取前的状态和读取结果判断:
- 先记录读取操作前的EOF状态:
bool eof_before_read = stream.eof(); std::string s; // 执行目标读取操作 std::getline(stream, s); // 或 stream >> s; - 根据状态判断:
- 若
eof_before_read为true:说明读取前流已经处于末尾,即场景2:流为空。 - 若
eof_before_read为false:说明读取过程中到达流末尾且未读取到有效字符,属于场景1:读取的是流的最后一行/最后一段无有效字符的内容。
- 若
补充细节:
std::getline()只有在未读取到任何字符就碰到EOF时,才会同时触发fail()和eof();如果读取到非空字符串,只会触发eof(),不属于本次讨论的三种场景。operator>>会自动跳过空白字符,若流中只有空白内容,读取时会直接走到EOF且无法读取有效字符串,此时触发fail()和eof(),属于场景1的特殊情况;若流完全无内容,读取前就处于EOF状态,属于场景2。
内容的提问来源于stack exchange,提问作者DYZ
相关产品推荐
相关产品推荐

