为何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。
读取
std::string的情况>>运算符读取std::string时,会持续读取字符直到遇到空白符或流结束。当输入是单个字符A时,运算符会先读取A,接着尝试读取下一个字符以确认是否还有更多内容——此时发现已经到达流的末尾,于是设置eofbit。由于eofbit被置位,good()返回false。读取
char的情况>>运算符读取char时,只需要读取单个字符。输入的A被成功读取,此时流的状态没有任何错误位被设置:虽然流已经到达末尾,但eofbit只会在尝试读取却无法获取字符的时候才会被触发。这次读取操作本身是成功完成的,所以good()返回true。
内容的提问来源于stack exchange,提问作者user3882729
相关产品推荐
相关产品推荐

