我有一个涉及流程的C ++课程的编程作业,我正在努力更好地理解为什么某些功能以他们的方式工作。
我正在读取来自istringstream的输入,文本后面有空格。为什么在输出中重复最后一个字?
istringstream is;
string inputstring = "The cliched statement regarding the big brown dog and foobar or something ";
string outputstring;
is.str(inputstring);
while (is.good())
{
is >> outputstring;
cout << outputstring << endl;
}
所以,我现在正在将提取作为while条件而不是循环好的标志:
while (is >> outputstring)
...
这很好用,不会重复最后一个字。什么是关于这个语句在完成读取后突破while循环?提取返回对同一个流的引用,但是检查标志还是什么?
是否有一个标题允许您包含所有流?
答案 0 :(得分:2)
这个语句在完成阅读时突破了while循环是什么意思?提取返回对同一个流的引用,但是检查标志还是什么?
提取运算符返回对流的引用是绝对正确的。用作while
循环(也是for
和do
- while
循环和if
语句)的控制条件的任何表达式都被强制转换为{{1} }类型。它计为bool
转化,因此调用explicit
,返回ios_base::operator bool()
。这就是检查标志的方式。
答案 1 :(得分:1)
为什么在输出中重复最后一个单词?
这就是:因为inputstring
末尾有空格,读取最后一个单词不会翻转good()位。程序在最后一个单词后面找到一个空格字符,认为有更多单词,因此is.good()
仍会返回true
。如果程序试图读取字符串的结尾,则is.good()
仅返回false;这还没有发生。
然后,当您下次循环并从is
读取时,程序会意识到没有其他单词,不会覆盖 outputstring
,等等你再写一次outputstring
之前的内容,这是最后一句话。
尝试在从is.good()
读取之前和之后打印is
的结果,并删除inputstring
末尾的空格字符以查看更改...
答案 2 :(得分:0)
您始终需要检查读取后,因为流可能处于良好状态但尝试读取内容可能会失败:毕竟,流无法知道您要阅读的内容。因此,当您在最后一个元素之后检查流时,它仍然是good()
。然后,您尝试阅读哪个失败,good()
为false
,但无论如何都会打印该值。
另外,不希望使用.good()
作为条件,因为即使在读取成功后,如果流的结束,这可能会变为false
达成了。例如,如果读取了一个数字,并且文件末尾的数字后面没有空格,则设置std::ios_base::eofbit
。只需使用这样的idomatic循环:
while (in >> value) {
std::cout << "read value='" << value << "'\n";
}
它看起来太简单了,但却没有做到正确的事情!