从输入流中读取

时间:2012-09-30 16:36:04

标签: c++ string inputstream istringstream

我有一个涉及流程的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循环?提取返回对同一个流的引用,但是检查标志还是什么?

是否有一个标题允许您包含所有流?

3 个答案:

答案 0 :(得分:2)

  

这个语句在完成阅读时突破了while循环是什么意思?提取返回对同一个流的引用,但是检查标志还是什么?

提取运算符返回对流的引用是绝对正确的。用作while循环(也是fordo - 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";
}

它看起来太简单了,但却没有做到正确的事情!