我对“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上测试它时,输出是:
这是一项测试
再次测试
这是一项测试
有人能为我解释令人沮丧的功能吗?
答案 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;
}
流上的第一个getline
集eofbit
。然后第二个失败,line
保持不变。
通过修复,您将获得:
this is a test
test again
test again
因为getline
没有添加到字符串中,所以它会替换内容。
答案 1 :(得分:0)
从documentation for std::getline
开始,line
之前的str.erase()
价值无关紧要。
- 致电{{1}}
醇>
您的第二个逻辑错误是由于在您到达目的地后重新使用了一个流。