0

我对“istream& getline (istream& is, string& str)”函数感到困惑,根据http://www.cplusplus.com/reference/string/string/getline/,以下程序:

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream s("this is a test");
    std::string line = "line ";
    getline( s, line );
    std::cout << line << std::endl;
    s.str("test again");
    getline( s, line );
    std::cout << s.str() << std::endl;
    std::cout << line << std::endl;

    return 0;
}

我希望输出是:

行这是一个测试

再次测试

再次测试

但是当我在 Visual Studio 上测试它时,输出是:

这是一个测验

再次测试

这是一个测验

谁能为我解释一下令人沮丧的功能?

4

2 回答 2

4

清除调用之间的错误标志getline

int main()
{
    std::istringstream s("this is a test");
    std::string line = "line ";
    getline( s, line );
    std::cout << line << std::endl;
    s.str("test again");
    s.clear()   // <<<--------------- to clear error flags
    getline( s, line );
    std::cout << s.str() << std::endl;
    std::cout << line << std::endl;

    return 0;
}

第一getlineeofbit在流上。然后第二个失败并line保持不变。

通过修复,您将获得:

this is a test
test again
test again

因为getline不添加到字符串中,它会替换内容。

于 2013-09-19T13:39:38.000 回答
0

调用之前的任何值line都无关紧要,如以下文档所示std::getline

  1. 来电str.erase()

您的第二个逻辑错误是由于在您到达终点后重用流。

于 2013-09-19T13:40:48.793 回答