从已设置两次的 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
感谢您的帮助。 我的程序从标准输入读取行。第一个有一个单一的数字,它决定了程序的模式 运行,其余的包含不确定长度的数字序列。行数由模式决定。我想将这些行解析为 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