失败后的 istream 阅读
istream reading after failure
我有一小段代码来读取用户数据,如下所示:
#include<iostream>
#include<vector>
#include<algorithm>
#include<ios>
#include<iomanip>
#include<string>
using namespace std;
istream& read_dt(istream& in, vector<int>& nmbr) {
if(in) {
nmbr.clear();
int x;
while(in >> x) {
nmbr.push_back(x);
}
if(in.fail()) {
string s;
in >> s;
in.clear();
}
}
return in;
}
int main() {
vector<int> data;
cout << "Enter all the data: " << endl;
read_dt(cin, data);
cout << "Size: " << data.size() << endl;
}
当我使用以下数据编译并执行上述程序时:
1 2 3 4 r t 5 6 7
我似乎得到了一个大小为 4 而不是大小为 7 的向量。尽管如此,我在上面实现的是,当用户提供无效输入作为数据时(在本例中 'r' 和 't'),即数据被丢弃并清除输入(使用 in.clear()),其余输入 "pushed" 进入矢量数据。
但这似乎并没有发生。我究竟做错了什么?有人可以帮忙吗?
谢谢。
一旦流发生故障,流将保持失败状态(没有读取可以成功)直到您清除()流。
现在,您正试图在清除流之前从流中读取坏数据,这样读取永远不会成功。此外,在清除坏数据后,您不提供任何方法继续从流中读取数据——您执行 while 循环,然后当它退出时,您从流中清除坏数据(如果有的话) , 然后 return 你读到的内容。
对于这种情况,您几乎需要在流上与 eof() 分开进行测试,并继续阅读直到到达 eof()——要么数据被转换,要么被忽略。
鉴于您要在下一个白色 space 之前尝试忽略错误数据,我会使用 ignore
而不是将数据读入字符串。将您不关心的数据读入字符串没有任何意义。
#include<iostream>
#include<vector>
#include<algorithm>
#include<ios>
#include<iomanip>
using namespace std;
istream& read_dt(istream& in, vector<int>& nmbr) {
if (in) {
nmbr.clear();
int x;
for(;;) {
in >> x;
if (in.eof())
break;
if (in.fail()) {
in.clear();
in.ignore(100, ' ');
}
else
nmbr.push_back(x);
}
return in;
}
}
int main() {
vector<int> data;
cout << "Enter all the data: " << endl;
read_dt(cin, data);
cout << "Size: " << data.size() << endl;
}
我有一小段代码来读取用户数据,如下所示:
#include<iostream>
#include<vector>
#include<algorithm>
#include<ios>
#include<iomanip>
#include<string>
using namespace std;
istream& read_dt(istream& in, vector<int>& nmbr) {
if(in) {
nmbr.clear();
int x;
while(in >> x) {
nmbr.push_back(x);
}
if(in.fail()) {
string s;
in >> s;
in.clear();
}
}
return in;
}
int main() {
vector<int> data;
cout << "Enter all the data: " << endl;
read_dt(cin, data);
cout << "Size: " << data.size() << endl;
}
当我使用以下数据编译并执行上述程序时: 1 2 3 4 r t 5 6 7
我似乎得到了一个大小为 4 而不是大小为 7 的向量。尽管如此,我在上面实现的是,当用户提供无效输入作为数据时(在本例中 'r' 和 't'),即数据被丢弃并清除输入(使用 in.clear()),其余输入 "pushed" 进入矢量数据。
但这似乎并没有发生。我究竟做错了什么?有人可以帮忙吗?
谢谢。
一旦流发生故障,流将保持失败状态(没有读取可以成功)直到您清除()流。
现在,您正试图在清除流之前从流中读取坏数据,这样读取永远不会成功。此外,在清除坏数据后,您不提供任何方法继续从流中读取数据——您执行 while 循环,然后当它退出时,您从流中清除坏数据(如果有的话) , 然后 return 你读到的内容。
对于这种情况,您几乎需要在流上与 eof() 分开进行测试,并继续阅读直到到达 eof()——要么数据被转换,要么被忽略。
鉴于您要在下一个白色 space 之前尝试忽略错误数据,我会使用 ignore
而不是将数据读入字符串。将您不关心的数据读入字符串没有任何意义。
#include<iostream>
#include<vector>
#include<algorithm>
#include<ios>
#include<iomanip>
using namespace std;
istream& read_dt(istream& in, vector<int>& nmbr) {
if (in) {
nmbr.clear();
int x;
for(;;) {
in >> x;
if (in.eof())
break;
if (in.fail()) {
in.clear();
in.ignore(100, ' ');
}
else
nmbr.push_back(x);
}
return in;
}
}
int main() {
vector<int> data;
cout << "Enter all the data: " << endl;
read_dt(cin, data);
cout << "Size: " << data.size() << endl;
}