从已设置两次的 istringstream 中提取格式化输入时出现问题

Problem extracting formatted input from an istringstream that has been set twice

感谢您的帮助。 我的程序从标准输入读取行。第一个有一个单一的数字,它决定了程序的模式 运行,其余的包含不确定长度的数字序列。行数由模式决定。我想将这些行解析为 int 向量。为此,我使用了 getline 和 istringstream。然后我得到格式化提取的数字>>。我第一次将字符串传递给流时,没有任何问题,字符串已正确传递给流,我可以从中读取格式化输入。但是,如果我得到另一条线并将其传递给同一流,则会发生一些奇怪的事情。该字符串已正确复制到流中,我通过编写

std::cout << iss.str() << std::endl

但是,当我尝试从该行中提取数字时,它没有。

这是一个最小可重现的例子:

(我尝试用两个不同的流来做它并且它有效,问题是我有一个开关块内的案例,所以它不允许我初始化它里面的流,以及流的数量从模式到模式变化很大。)

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

using namespace std;

int main()
{
    string line;
    int problem_type = -1, input_number = -1;
    vector<int> sequence;
    istringstream iss;

    /* Get the problem type */
    getline(cin, line);
    iss.str(line);
    if (!iss)
        return -1;
    cout << "Stream contents: " << iss.str() << endl;
    iss >> problem_type;
    cout << "Extracted numbers: " << problem_type << endl;
    
    getline(cin, line);
    iss.str(line);
    if (!iss)
        return -1;
    cout << "Stream contents: " << iss.str() << endl;

    cout << "Extracted numbers:";
    while(iss >> input_number) {
        cout << " " << input_number;
        sequence.push_back(input_number);
    }
    cout << endl;
    return 0;
}

输入:

1
1 2 3 4 5

输出:

Stream contents: 2
Extracted numbers: 2
Stream contents: 1 2 3 4 5
Extracted numbers:

预期输出:

Stream contents: 2
Extracted numbers: 2
Stream contents: 1 2 3 4 5
Extracted numbers: 1 2 3 4 5

一旦你阅读 iss >> problem_type;,

cout << "eof: " << iss.eof() << endl;

产出

eof: 1

接下来iss.str(line);不重置流状态,循环条件为false。你要

iss.clear();
while(iss >> input_number) {
    cout << " " << input_number;
    sequence.push_back(input_number);
}

输出

Stream contents: 1
Extracted numbers: 1
Stream contents: 1 2 3 4 5
Extracted numbers: 1 2 3 4 5