文件操作EOF()的问题

大家在使用C++写操作文件的程序时,一定使用过eof()这个函数,用它来判别文件结束,但有不少也用来判别文件是否为空的.但是,这样操作的结果不是我们所想的.看下面程序:

#include  < string >

using   namespace  std;

int  main()
{
    char c = 'c';
    ifstream FILE("test.txt");
    if (FILE.eof())
        cout << "文件是空的."<<endl;exit(1); 

    while (!FILE.eof())
    {
        FILE.get(c);
        cout << c;
    }
    
    system("pause");
    return 0;
}


当test.txt为空文件时,它输出的是:c
奇怪!应该输出是:文件是空的. while里面的操作也应该不用到的.但是结果偏偏和我们所想的相反.
好,那操作二进制文件又是怎样的呢?修改下为:

 ifstream FILE( " test.txt " ,ios:: in | ios::binary);
     if  (FILE.eof())
        cout  <<   " 文件是空的. " <      while  ( ! FILE.eof())
     {
        FILE.read(&c,1);
        cout << c;
    }
// 代码其他部分相同

结果输出还是c..噢!!怎么会这样的.分明是骗人的东西嘛!!到底是什么原因呢?
     经过一段研究后,原来eof()返回true的条件是"读到文件结束符",而不是文件内容的最后一个字符。
要清楚"文件结束符"(0xff).就是说我们文件最后的字符不是文件结束符,而最后的字符的下一位才是.所以操作再读多一次.就为什么上面if (FILE.eof())总是false的. 在一些编译器中(dev c++),它读到最后一个字符后文件位置的指针会定在那儿,所以就会重复最后一个字符.     
    在一个外国的CPP论坛见到一位同志的代码刚好有这解决方法.现在把上面的代码改为下面的:

#include  < iostream.h >
#include  < stdlib.h >
#include  < fstream.h >

int  main()
{
    char c = 'c';
    ifstream FILE("test.txt");
    if (FILE.peek() == EOF)//修改 
    {
        cout << "文件是空的."<< endl; 
        exit(1);
    }
       
    while (FILE.peek() != EOF)//修改
    {
        FILE.get(c);
        cout << c;
    }
    
    system("pause");
    return 0;
}

主要的是把eof()改为peek() == EOF来判别,其中peek()是取文件当前指针,EOF是文件尾标符,它的值为-1.所以采用这种方法就解决上面eof()的问题了..这种方法也可以用在读写二进制文件中.

 

转自:http://www.cppblog.com/stdyh/archive/2010/05/10/8794.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值