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

为何std::stringstream的good()在char与std::string下返回值不同?

为什么std::stringstream的good()在读取std::string和char时行为不同?

问题背景

当变量z分别为std::string和char类型时,执行ss >> z后调用std::stringstream::good()的返回结果完全相反:读取std::string时返回false,读取char时返回true,需要明确背后的原因。

代码示例

#include <iostream>
#include <sstream>

int main() {
   std::string line;
   while (getline(std::cin, line)) {
      std::cout << "Reading new line Size " << line.size() << "\n";
      std::stringstream ss{line};
      std::string z; // 可改为char类型测试
      ss >> z;
      if (ss.good()) {
         std::cout << "Stream good\n";
      } else {
         std::cout << "Not good\n";
      }
   }
}

两种测试场景的输出

当z为std::string时

$ ./a.out
A
Reading new line Size 1
Not good

当z为char时

$ ./a.out
A
Reading new line Size 1
Stream good

原因解释

要理解这个差异,得先明确std::ios::good()的判定规则:只有当流的eofbit(到达流末尾)、failbit(读取失败)、badbit(流损坏)全部未被设置时,good()才会返回true。

  1. 读取std::string的情况
    >>运算符读取std::string时,会持续读取字符直到遇到空白符或流结束。当输入是单个字符A时,运算符会先读取A,接着尝试读取下一个字符以确认是否还有更多内容——此时发现已经到达流的末尾,于是设置eofbit。由于eofbit被置位,good()返回false。

  2. 读取char的情况
    >>运算符读取char时,只需要读取单个字符。输入的A被成功读取,此时流的状态没有任何错误位被设置:虽然流已经到达末尾,但eofbit只会在尝试读取却无法获取字符的时候才会被触发。这次读取操作本身是成功完成的,所以good()返回true。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:43:22