You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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. 区分流为空和读取到最后一行

在流已打开的前提下,通过读取前的状态和读取结果判断:

  1. 先记录读取操作前的EOF状态:
    bool eof_before_read = stream.eof();
    std::string s;
    // 执行目标读取操作
    std::getline(stream, s); // 或 stream >> s;
    
  2. 根据状态判断:
    • 若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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:38:12