我清空了一个字符串流,然后我试图再次填充它而没有任何成功。我不明白为什么。这是我的代码:
#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;
}
答案 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";