c++ std::istringstream::peek()应该设置eof标志吗?

qvtsj1bj  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(156)

请考虑以下代码:

#include <iostream>
#include <sstream>

void print_flags(std::istringstream & iss)
{
   std::cout << "good: " << iss.good() << ", eof: " << iss.eof() << ", fail: " << iss.fail() << ", bad: " << iss.bad() << "\n";
}

int main()
{
    std::istringstream iss("A");
    char chr;
    iss >> chr;
    print_flags(iss);
    iss.peek();
    print_flags(iss);
}

在g和clang上,我都看到了以下输出:

good: 1, eof: 0, fail: 0, bad: 0
good: 0, eof: 1, fail: 0, bad: 0

cppreference文章没有提到peek修改标志。它提到了get修改的标志:cppreference
这种行为是否符合标准?

wj8zmpe1

wj8zmpe11#

是的,这是对 UnformattedInputFunction 的要求。
首先,peek的描述(重点是我的):
效果:表现为无格式输入函数(如上所述)。构造哨兵对象后,读取但不提取当前输入字符。
返回:traits​::​eof(),如果good()false。否则,返回rdbuf()->sgetc()
然后,根据上面对 UnformattedInputFunction 的描述(强调我的):
[...]如果rdbuf()->sbumpc()或**rdbuf()->sgetc()返回traits​::​eof(),则ios_base​::​eofbit被设置为**本地错误状态,输入函数停止尝试获取请求的输入。[...]

相关问题