C++:在达到'end of file'或错误后重置 istream
C++: Resetting an istream after reaching an 'end of file' or error
在使用"std::cin>>"输入值时出错后,我希望能够继续使用输入。
例如,在将字符放入整数变量后,源中使用cin函数的所有其他语句都将停止工作。
创建错误后是否可以继续使用cin?
#include <iostream>
using namespace std;
int addition(){
int sum = 0, val = 0;
while(cin >> val){
sum += val;
}
return sum;
}
int multiplication(){
int x = 0, y = 0;
cin >> y;
x = y;
while(cin >> y){
x = x * y;
}
return x;
}
int main()
{
int x = addition();
int y = multiplication();
return 0;
}
如果因为试图读取整数而得到一些"非数字"字符而导致错误,则需要使用cin.clear()
来清除错误,然后使用cin.get()
或类似方法来删除有问题的字符。如果你收到了end-of-file
,那就更难了,因为在某些实现中,它往往会"卡住"——所以,基本上,如果你碰到了文件的末尾,除非你跳过一些非常糟糕的环节,否则游戏就结束了(写自己的streambuf
似乎是一个解决方案,但我被告知,这就像在眼睛里扎滚烫的针一样令人愉快——从来没有真正尝试过…)
有很多替代的解决方案,比如读一个字符串,然后尝试将其翻译成数字,或者一次读一个字符,然后自己翻译,或者使用一些现成的库为您翻译。如果用户点击"文件结尾"键(Windows和其他一些系统中的CTRL-Z,Linux/Unix/MacOS X和相关系统中的CTRL-D-不确定X之前的MacOS,但有人在乎吗?)
您只需要读出字符并重试。
while( !(cin >> y) && !cin.eof() )
{
cin.get(); // Skip invalid character
}
这有点不寻常。我们通常期望的是输出一个错误。如果在提示下输入值,我们倾向于使用getline
,然后解析结果:
while(1)
{
string line;
if( getline(cin, line) )
{
istringstream iss(line);
if( iss >> y ) {
break;
} else {
cerr << "Invalid input. Try again.n";
}
} else {
cerr << "End of streamn";
break;
}
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- 为什么我在使用 istream 迭代器时会出现 seg 错误?
- 关于 istream 中的错误处理的问题
- 错误:与"运算符>>"不匹配(操作数类型为"std::istream
- 尝试重载时'ostream'和'istream'错误C++
- 错误:无法将"std::istream {aka std::basic_istream<char>}"lvalue 绑定到"std::basic_istream&<char>&
- C - iStream错误标志
- 错误:"运算符>>"不匹配 重载 istream 运算符
- C++,错误:" no operator "== " matches these operands ",ostream/istream
- C++的 istream::eof() 的不一致是规范中的错误还是实现中的错误?
- 错误在模板类中调用过载的ISTream运算符
- C++ istream >> 和 ostream << 错误
- 错误:"与'运算符<<'不匹配(操作数类型为 std::istream)
- 错误 C2061:语法错误:标识符"istream"
- C++:在达到'end of file'或错误后重置 istream
- 在使用异常时改进istream助手类的错误处理
- 需要有关此编译错误的帮助 getline 函数错误:没有匹配函数调用"getline(std::istream&,char&)"|
- 尝试从istream存储令牌时出现分段错误
- 使失败并显示错误"cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ in return"