c++ 为什么stringstream不阅读额外的数据?[重复]

e3bfsja2  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(98)

此问题在此处已有答案

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对象来解决这个问题,所以它工作得很好,但是我想重用第一个对象并理解我知识中的差距。

e5nqia27

e5nqia271#

流有状态。这个状态会影响它们的行为。
尝试在ss << line行之后添加这一行,看看它会输出什么。

cerr << "ss state: " << ss.good() << " " << ss.fail() << " "
     << ss.bad() << " " << ss.eof() << " " << ss.tellg() << " "
     << ss.tellp() << "\n:" << ss.str();

字符串
在继续阅读之前,请先执行此操作。
第一个getline循环将流置于eof(到达数据结尾)和fail(无法执行最后一个操作)状态。在这种状态下,它什么也不做。插入新行没有效果。尝试读取任何内容都没有效果。您必须完全重置流或(最好)创建一个新的流来实际使用流做一些有用的事情。

相关问题