考虑以下简单的程序,它将空格上的输入拆分,并打印出每行一个非空白标记:
#include <iostream>
int main(int argc, char* argv[])
{
while (std::cin)
{
std::string s;
std::cin >> s;
std::cout << "-" << s << "-\n";
}
return 0;
}这很好--只是因为输入流只在我们尝试从它读取之后指示EOF,当它到达输入流(^D)的末尾时,它读取并发出一个空字符串:
[begin]
< a b c
> -a-
> -b-
> -c-
< (^D)
> --
[end]我们可以通过使输出行以!s.empty()为条件来处理这一问题。
然而,还有另一个选择。我们可以替换这条线路:
while (std::cin)通过以下方式:
while (std::istream::sentry(std::cin))sentry对象(通常由operator>>在内部使用)的效果是使用空白,然后检查EOF或其他流状态:
[begin]
< a b c
> -a-
> -b-
> -c-
< (^D)
[end]我的问题有三个:
发布于 2015-10-08 12:21:59
std::istream::sentry用于内部输入函数。解决问题的正确方法是始终检查流是否良好,即阅读后读取成功:
for (std::string s; std::cin >> s; ) {
std::cout << '-' << s << "-\n";
}在读取之前,流无法知道读取操作是否成功。做完之后,它就知道了。
使用sentry的方法通常适用于字符串,但对于需要任何格式的类型,它可能会失败。例如,如果需要读取int,则跳过sentry的空格并不表示是否可以读取int。即使使用std::string,这种方法也可能失败:流可以在第一次访问时提供字符,但在第二次访问时提供字符。第一次访问是确定字符不是来自sentry构造函数的空格,因为字符串读取失败。
https://stackoverflow.com/questions/33015411
复制相似问题