2

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

#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;
}
4

3 回答 3

3

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

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

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

ss1.clear();

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

于 2013-08-25T17:52:22.060 回答
0

尽管在完成读取后您仍然需要向clear()流写入数据,但您可以考虑使用istream_iterators 从文件中读取数据:

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";
于 2013-08-25T18:35:39.383 回答
0

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

哦,ss1 >> number你应该ss1在使用前检查状态number。 在最后一次读取失败之前eof()不返回true

于 2013-08-25T17:52:54.467 回答