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

如何构造读取5个字符后触发failbit/badbit的std::istream?

构造触发failbit/badbit的std::istream以通过指定测试函数

需要构造一个std::istream对象,使其在成功读取至少5个字符后触发std::failbit或std::badbit,以此编写单元测试验证代码对这两种状态的处理逻辑。要求下方不可修改的test函数返回true并输出hooray。

不可修改的测试函数

bool test(std::istream &in) {
  int numchars = 0;
  while (in.good()) {
    int c = in.get();
    if (c == EOF) {
      std::cout << "eof encountered" << std::endl;
      return false;
    }
    std::cerr << "read: " << static_cast<char>(c) << std::endl;
    numchars++;
  }

  if (numchars < 5) {
    std::cout << "too few characters read" << std::endl;
    return false;
  }

  std::cout << "hooray" << std::endl;
  return true;
}

无效尝试示例

尝试1:提前设置failbit

std::stringstream ss("This is a test string.");
ss.setstate(std::ios::failbit);
test(ss); // 返回false,输出`too few characters read`

原因:提前设置状态会让in.good()直接返回false,读取的字符数为0,不满足至少5个的要求。

尝试2:使用完整字符串流

std::stringstream ss("This is a test string.");
test(ss); // 返回false,输出`eof encountered`

原因:字符串流读完所有字符后触发eofbit,此时in.get()返回EOF,函数会直接返回false,无法走到后续的字符数判断逻辑。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:58:13