std::istringstream::peek()是否应设置eof标志?该行为符合C++标准吗?
问题解答
这个peek()设置eof标志的行为完全符合C++标准,下面详细解释:
代码行为分析
先拆解你的代码执行流程:
- 初始化
istringstream为字符串"A",此时流的读取指针指向第一个字符'A'。 - 通过
iss >> chr读取'A',读取完成后指针移动到'A'的下一个位置——也就是流的末尾。此时流状态:good=1,eof=0(因为只是指针到了末尾,还未尝试读取超出末尾的内容,所以eofbit未被触发)。 - 调用
iss.peek():这个函数的作用是查看当前指针位置的字符但不移动指针,此时它尝试读取指针所在位置的内容,发现已经到达流末尾,于是触发eofbit的设置。
C++标准对peek()的规定
根据C标准(以C17为例),std::basic_istream::peek()的行为明确包含:
- 调用底层流缓冲区的
sgetc()函数获取当前位置的字符。 - 如果
sgetc()返回traits::eof()(表示到达流末尾),则会设置流的eofbit状态位,同时函数返回traits::eof()。
至于cppreference的描述,其实包含了相关规则(可能你未注意到):peek()在无法获取有效字符(比如到达流末尾)时,会设置eofbit,这和标准规定完全一致。
补充说明
流的good()状态仅在所有错误位(eofbit、failbit、badbit)都未被设置时才为true,所以当eofbit被设置后,good()自然变为0,这也和你观察到的输出结果匹配。
内容的提问来源于stack exchange,提问作者Krzysiek Karbowiak
相关产品推荐
相关产品推荐

