提问人:Krzysiek Karbowiak 提问时间:10/19/2023 更新时间:10/19/2023 访问量:56
std::istringstream::p eek() 应该设置 eof 标志吗?
Is std::istringstream::peek() supposed to set the eof flag?
问:
请考虑以下代码:
#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 文章没有提到修改标志。它提到了由以下方式修改的标志:cppreference。peek
get
就标准而言,这种行为是否正确?
答:
4赞
Yksisarvinen
10/19/2023
#1
是的,这是 UnformattedInputFunction 的要求。
一、窥视
的描述(强调我的):
效果:表现为未格式化的输入函数(如上所述)。 构造哨兵对象后,读取但不提取当前输入字符。
返回: if is . 否则,返回rdbuf()->sgetc()。
traits::eof()
good()
false
然后,从上面对 UnformattedInputFunction 的描述(强调我的):
[...]如果
或 rdbuf()->sgetc()
返回 ,则ios_base::eofbit
设置为本地错误状态,并且输入函数停止尝试获取请求的输入。[...]rdbuf()->sbumpc()
traits::eof()
评论
peek
“行为为 UnformattedInputFunction”。如果点击该链接,您将看到 UnformattedInputFunction 具有设置的副作用eofbit