【问题标题】:Repeated value at the end of the file [duplicate]文件末尾的重复值[重复]
【发布时间】:2013-09-06 16:47:10
【问题描述】:

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

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;
}

你能帮我找出错误吗?我在网上搜索过,我的代码在语法和逻辑上似乎都是正确的。

【问题讨论】:

  • SO 上已经有几十个帖子了,请搜索一下
  • while(inFile&gt;&gt;grades)
  • 再一次:不要使用while(!inFile.eof())。也不要使用while(inFile.good()) 请参阅Why is iostream::eof inside a loop condition considered wrong?
  • 真正的问题是他从哪里得到这个成语。任何使用它的网站或书籍都对垃圾桶有好处,别无其他。

标签: c++ file-io ifstream


【解决方案1】:

这是错误的

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

这是对的

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

一定是这个论坛上最常见的错误。 eof() 不会告诉您 下一个 读取会出现文件结束错误,它会告诉您 上一个 读取由于文件结束而失败。所以如果你必须使用eof(),你应该在after使用它,而不是before

【讨论】:

  • 它不会告诉你最后一次读取是否失败。 eof() 在成功读取后是否返回 true 取决于您正在阅读的内容以及您在输入序列中的位置。你只能说 if eof() 返回 true,下一次读取将失败(但如果返回 false,下一次读取也可能失败)。而 if fail() 返回 true,eof() 为 true,很有可能(但不是 100%)失败的原因是我们在读取之前已经到达文件末尾价值。
  • 关于您的最后一句话:在您通过其他方式检测到故障之前,没有合理使用eof()。它的唯一用途是尝试确定失败的原因,即fail() &amp;&amp; !eof() 表示您在输入中有格式错误。
【解决方案2】:

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

首先要实现的是所有的功能 测试状态基于上次输入的结果。你必须 在使用任何东西之前总是检查输入是否成功 你输入了;当你写:

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

没有验证之前输入是否成功 访问成绩。在这种情况下,如果输入失败,您将获得 以前的值;如果没有以前的值,你会得到 未定义的行为。在&gt;&gt;&lt;&lt; 之间的某个地方, 您必须检查&gt;&gt; 是否成功。

检查成功的常用方法是使用流 本身作为一个布尔值。因为&gt;&gt; 返回一个引用 对于流,编写循环的惯用方式是:

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.
}

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

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 1970-01-01
    • 2013-11-25
    • 2021-05-05
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2020-10-31
    • 2016-01-06
    相关资源
    最近更新 更多