此问题在此处已有答案:
how to reuse stringstream(6个答案)
5天前关闭。
我有这个代码,我不能理解stringstream的行为,我是C++的新手。
**请注意,我已经解决了这个问题,我不想解决这个问题,我想了解这个问题中流的行为。
void solve()
{
string nl = "\n";
string color;
string line;
string piece;
cin >> color;
cout << color << nl;
cin.ignore(); // ignores the space
getline(cin, line);
stringstream ss(line);
while(getline(ss, piece, ',')) {
cout << piece << " " << piece.size() << nl;
}
cin >> color;
cout << color << nl;
cin.ignore(); // ignores the space
getline(cin, line);
ss << line;
while(getline(ss, piece, ',')) {
cout << piece << " " << piece.size() << nl;
}
}
字符串
输入是这个文本
White: Ke1,Qd1
Black: Ke8,Qd8
型
输出是
White:
Ke1 3
Qd1 3
Black:
型
正如我们在输出中看到的,它不会在黑色之后打印碎片。
根据我的理解,ss << line
第二次不工作了。我希望这一行应该在ss
流中添加新的字符(因为它是一个可写的流),我可以稍后阅读它(因为它是一个可读的流)。你能帮助我理解我的期望是否有误吗?
正如我提到的,我在第二次需要它的时候创建了一个新的stringstream对象来解决这个问题,所以它工作得很好,但是我想重用第一个对象并理解我知识中的差距。
1条答案
按热度按时间e5nqia271#
流有状态。这个状态会影响它们的行为。
尝试在
ss << line
行之后添加这一行,看看它会输出什么。字符串
在继续阅读之前,请先执行此操作。
第一个getline循环将流置于eof(到达数据结尾)和fail(无法执行最后一个操作)状态。在这种状态下,它什么也不做。插入新行没有效果。尝试读取任何内容都没有效果。您必须完全重置流或(最好)创建一个新的流来实际使用流做一些有用的事情。