考虑以下C ++程序:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main (void)
{
string l1, l2;
int n1, n2;
stringstream ss;
getline(cin, l1);
getline(cin, l2);
cerr << l1 << " " << l2 << endl;
ss.str(l1);
ss >> n1;
ss.str(l2);
ss >> n2;
cerr << n1 << " " << n2 << endl;
return 0;
}
示例输入:
2
3
对应输出:
2 3
2 0
但我在期待:
2 3
2 3
如果我在第二次调用ss.str()之前插入一个调用ss.clear(),那么输出就是我所期望的。这真的有必要吗?为什么?
答案 0 :(得分:3)
这是必要的,因为stringstring的第一个输入命中文件的末尾。调用str()
不会清除已在字符串流上设置的任何错误标志。
ss.str(l1);
ss >> n1; // Reads the entire buffer, hits the end of buffer and sets eof flag
ss.str(l2); // Sets the string, but does not clear error flags
ss >> n2; // Fails, due to at EOF
您可以在第二个str()之前或之后使用clear,只要它在您尝试读取更多数据之前使用。