从getline读取非空字符串时出现意外输出

时间:2013-09-19 13:34:25

标签: c++ getline

我对“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上测试它时,输出是:

这是一项测试

再次测试

这是一项测试

有人能为我解释令人沮丧的功能吗?

2 个答案:

答案 0 :(得分: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没有添加到字符串中,所以它会替换内容。

答案 1 :(得分:0)

documentation for std::getline开始,line之前的str.erase()价值无关紧要。

  
      
  1. 致电{{1}}
  2.   

您的第二个逻辑错误是由于在您到达目的地后重新使用了一个流。