文件末尾的重复值

时间:2013-09-03 12:34:34

标签: c++ file-io ifstream

我正在编写一个程序来从文件中获取输入并将其显示在控制台上。问题是最后一个条目重复了两次。代码如下: -

int main(void)
{
    string filename;
    int grades;
    cout<<"Enter the filename:"<<endl;
    getline(cin,filename);
    ifstream inFile(filename.c_str(),ios::in);
    if(!inFile){
        cout<<"File does not exist."<<endl;
        exit(1);
    }
    while(!inFile.eof())
    {
        inFile>>grades;
        cout<<grades<<endl;
    }
    inFile.close();
    return 0;
}
你可以帮我找出错误吗?我在网上搜索过,我的代码似乎在语法上和逻辑上都是正确的。

2 个答案:

答案 0 :(得分:2)

这是错误的

while(!inFile.eof())
    {
        inFile>>grades;
        cout<<grades<<endl;
    }

这是对的

while (inFile >> grades)
{
   cout << grades << endl;
}

必须是此论坛上最常见的错误。 eof()并未告诉您下一次读取文件结尾错误,它会告诉您最后读取因文件结尾而失败。因此,如果您必须使用eof(),则应在之后使用,而不是之前

答案 1 :(得分:0)

语法正确,是的。但不是逻辑上的。你正在使用 eof()错误。

首先要意识到的是所有的功能 测试状态将其结果基于最后一个输入。你必须 在使用任何东西之前总是检查输入是否成功 你输入了;当你写:

inFile >> grades;
std::cout << grades;

验证输入之前是否成功 获得成绩。在这种情况下,如果输入失败,您将获得 以前的价值;如果没有以前的价值,你得到 未定义的行为。在>><<之间的某处, 你必须检查>>是否成功。

检查成功的常用方法是使用流 本身作为布尔值。并且因为>>返回引用 对于流,编写循环的惯用方法是:

while ( inFile >> grades ) {
    std::cout << grades << std::endl;
}

从软件工程的角度来看,它太可怕了 (在while的条件下修改状态),但是成语 无处不在,以至于其他任何事情都会引发问题。

如果因任何原因出现输入错误,这将停止。一旦 你已经看到了失败(只有那时),你可以问为什么:

if ( inFile.bad() ) {
    //  Serious hardware failure...
} else if ( !inFile.eof() ) {
    //  Format error in the input...
} else {
    //  Normally, no more data in the input stream, but
    //  there are a few special cases where you could still
    //  have a format error and end up here.  Not with
    //  `int`, however.
}

但同样,在输入失败后,这只 有效。