istream读取失败后

2023-12-28

我有一小段代码来读取用户数据,如下所示:

#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 右 5 6 7

我似乎得到了一个大小为 4 而不是大小为 7 的向量。我在上面实现的是,当用户提供无效的输入作为数据(在本例中为“r”和“t”)时,该数据将被丢弃并输入被清除(使用 in.clear()),剩余的输入被“推”到向量数据中。

但这似乎并没有发生。我究竟做错了什么?有人可以帮忙吗?

Thanks.


一旦流发生故障,该流将保持失败状态(no读取可以成功)直到您清除()流。

现在,您试图在清除流之前读取坏数据,因此读取永远不会成功。此外,在清除坏数据后,您不提供任何方法继续从流中读取数据——您执行 while 循环,然后当它退出时,您从流中清除坏数据(如果有) ,然后返回您所阅读的内容。

对于这样的情况,您几乎需要在流上与 eof() 分开进行测试,并继续阅读直到到达 eof() ——要么数据被转换,要么被忽略。

鉴于您试图忽略坏数据直到下一个空格,我会使用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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

istream读取失败后 的相关文章

随机推荐