c ++无法重新填充字符串流

时间:2013-08-25 17:42:59

标签: c++ stringstream

我清空了一个字符串流,然后我试图再次填充它而没有任何成功。我不明白为什么。这是我的代码:

#include <string>
#include <iostream>
#include <sstream>

using namespace std;

int main(int argc, char* argv[] ) {

 stringstream ss1, ss2;
 ss1 << "0 1 2 3 40 5 6 76 8 9"; // Stream is filled with one string of chars
 vector <int> V;
 string st;
 int number;


 while(!ss1.eof() ) {
  ss1 >> number;  // Next int found in ss1 is passed to number
  V.push_back(number);
  ss2 << number << " "; // ss2 is filled with number + space in each iteration.  
 }   // Basically here, the content of ss1 has been passed to ss2, leaving ss1 empty.

 ss1 << "helloooo";
 getline(ss1, st);
 cout << st << endl; // <--- Here, st appears to be empty... Why ?

 return 0;
}

3 个答案:

答案 0 :(得分:3)

首先,您应该在尝试从中读取之后将流转换为布尔值,以检查流中的读取是否成功,例如:

while (ss1 >> number) {
    ...
}

输入后未进行测试往往会导致处理最后一次输入两次。现在,一旦此循环终止,ss1处于失败状态,即它已设置std::ios_base::failbit。此时,流将拒绝执行任何其他操作,直到该位清除为止。您可以使用clear()重置流状态:

ss1.clear();

之后,流应该再次处于良好状态。

答案 1 :(得分:0)

由于您点击了eof,因此该流处于错误状态。您必须重置它才能再次使用它。在你的情况下,我会放弃重置,只使用一个新的stringstream对象。

哦,在ss1 >> number之后,您应该在使用ss1之前检查number的状态。 eof()在上次阅读失败之前未返回true

答案 2 :(得分:0)

虽然读完后仍需要clear()流写入,但您可以考虑使用istream_iterator来读取文件中的数据:

stringstream ss1("0 1 2 3 40 5 6 76 8 9");

// initialize V from ss1
vector <int> V{std::istream_iterator<int>(ss1), std::istream_iterator<int>()};

// write values from V to ss2
std::copy(V.begin(), v.end(), std::ostream_iterator<int>(ss2));

ss1.clear();
ss1 << "helloooooo";