C++ C++;:在达到';文件末尾';或错误

C++ C++;:在达到';文件末尾';或错误,c++,iostream,C++,Iostream,在使用“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(){

在使用“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;
}
#包括
使用名称空间std;
整数加法(){
int sum=0,val=0;
while(cin>>val){
sum+=val;
}
回报金额;
}
整数乘法(){
int x=0,y=0;
cin>>y;
x=y;
而(cin>>y){
x=x*y;
}
返回x;
}
int main()
{
int x=加法();
int y=乘法();
返回0;
}

您只需读出字符,然后重试

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 stream\n";
        break;
    }
}
while(1)
{
弦线;
if(getline(cin,line))
{
istringstream iss(线);
如果(iss>>y){
打破
}否则{

cerr您只需读出字符,然后重试

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 stream\n";
        break;
    }
}
while(1)
{
弦线;
if(getline(cin,line))
{
istringstream iss(线);
如果(iss>>y){
打破
}否则{

cerr如果是因为试图读取整数并获得一些“非数字”字符而导致的错误,则需要使用
cin.clear()
清除错误,然后使用
cin.get()
或类似方法删除有问题的字符。如果您收到了文件结尾的
字符,则要困难得多,因为这样容易“粘住”在一些实现中——因此,基本上,如果你点击了文件的末尾,游戏就结束了,除非你跳过了一些非常讨厌的障碍(编写自己的
streambuf
似乎是一种解决方案,但我被告知,这就像在你眼睛里插上滚烫的针头一样令人愉快——也从未真正尝试过……)


有许多替代解决方案,例如读取字符串,然后尝试将其转换为数字,或者一次读取一个字符,然后进行自己的翻译,或者使用一些现成的库为您进行翻译。如果用户点击“文件结束”键,这些都不能保证允许您继续(Windows和其他一些操作系统中的CTRL-Z,Linux/Unix/MacOS X和相关操作系统中的CTRL-D-不确定X之前的MacOS,但还有人关心吗?

如果这是一个错误,因为您试图读取整数并获得一些“非数字”字符,则需要使用
cin.clear()
清除错误,然后
cin.get()
或类似的方法来删除冒犯的角色。如果你收到了一个
文件结尾
,这会困难得多,因为在某些实现中,这往往会“粘住”——因此,基本上,如果你碰到了文件结尾,游戏就结束了,除非你跳过了一些非常讨厌的障碍(写你自己的
streambuf
似乎是一个解决方案,但我听说,这就像把滚烫的针头刺进你的眼睛一样令人愉快——也从未真正尝试过……)

有许多替代解决方案,例如读取字符串,然后尝试将其转换为数字,或者一次读取一个字符,然后进行自己的翻译,或者使用一些现成的库为您进行翻译。如果用户点击“文件结束”键,这些都不能保证允许您继续(Windows和其他一些操作系统中的CTRL-Z,Linux/Unix/MacOS X和相关操作系统中的CTRL-D——不确定X之前的MacOS,但还有人在乎吗?)