C ++正确使用stringstream :: str()?

时间:2011-09-30 00:13:54

标签: c++ stringstream

考虑以下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(),那么输出就是我所期望的。这真的有必要吗?为什么?

1 个答案:

答案 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,只要它在您尝试读取更多数据之前使用。