故障后的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"answers"t")时,该数据将被丢弃,输入将被清除(在.clear()中使用),其余输入将被"推"到矢量数据中。
但这似乎并没有发生。我做错了什么?有人能帮忙吗?
谢谢。
一旦流发生故障,流将保持失败状态(没有读取可以成功),直到清除()流。
现在,您正试图在清除流之前先从流中读取坏数据,这样读取就永远不会成功。此外,在清除了坏数据之后,您没有提供任何方法来继续从流中读取数据——您执行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;
}
相关文章:
- 使用 istream 参数读取的 istream 函数
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- 我可以从具有不同数字分隔符的istream中读取双值吗
- 读取 c++ istream 直到 EOF,同时丢弃内容
- 限制整数的 istream 读取宽度
- 是否可以覆盖 std::istream 读取方法?
- 从输入文件中读取c ,具有iStream Operator Overloading
- 从 istream 读取 bitset<0> 总是失败?
- IStream COM 读取到缓冲区,然后通过 winsock 发送
- 使用iStream从文件中读取int数据
- c++读取txt文件并复制到两个类istream::peek()中
- 创建要从现有 istream 读取的子流
- 如何从 c++ std::istream 读取固定数量的字节
- 如何从IStream读取一个char数组并将其写入另一个IStream
- 读取文件并保存在 iStream C++ 中
- 读取 istream 的名称
- 自己的std ::带有回调或事件的ISTREAM,以避免拉或阻止读取
- 故障后的istream读取
- 如何安全地读取std::istream中的行
- 从 istream 输入中一次读取一个字符