c ++中的文件处理

Fru*_*der 0 c++ file-handling

我编写了以下代码来输入文件中的数字,但是最后一个数字被打印了两次,这让我感到困惑.什么是可能的答案.提前致谢.

码:

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    int x;
    ifstream f;
    f.open("note");
    while(!f.eof()){
            f>>x;
            cout<<x<<endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

1
2
3
4
5
5
Run Code Online (Sandbox Code Playgroud)

文件说明的内容是:

1
2
3
4
5 
Run Code Online (Sandbox Code Playgroud)

M'v*_*'vy 5

这是因为EOF仅当您尝试阅读时才设置标志EOF.(这是一个错误标志)

所以你最好f.eof()在循环结束时进行测试.


Jim*_*ter 5

让我试着比以前的答案更有启发性.f>>x读取一个整数,以便扫描输入数字.它看到'5'然后'\n',这不是一个数字,所以它在'5'之后停止并将x设置为5.它还没有遇到eof,你的循环再次执行,然后f>>x读取'\n '然后当它击中eof时失败,保持x不变,然后再次打印5.因此,您需要在阅读后和打印前进行测试.最简单(也是首选)的方法是

while(f>>x)
    cout<<x<<endl;
Run Code Online (Sandbox Code Playgroud)

你不应该这样

do{
    f>>x;
    cout<<x<<endl;
}while(!f.eof());
Run Code Online (Sandbox Code Playgroud)

(在读取之后和打印之前不进行测试)因为如果输入文件不包含任何数字x会导致未定义的行为 - 是单元化的并且您将打印垃圾(或者可能炸毁世界,但可能不会).