C++之EOF()

本文详细解释了C++输入输出流的eof()函数的实现逻辑,通过实例演示了如何正确使用eof()来判断文件是否到达末尾。同时,提供了一种替代方法peek()==EOF来解决特定场景下的问题,并讨论了其在读写二进制文件中的应用。
摘要由CSDN通过智能技术生成

fstream流的eof()判断有点不合常理

    按常理逻辑来说,如果到了文件末尾的话,eof()应该返回真,但是,C++输入输出流如何知道是否到末尾了呢?

    原来根据的是:如果fin>>不能再读入数据了,才发现到了文件结尾,这时才给流设定文件结尾的标志,此后调用eof()时,才返回真。

    假设

    find>>x; //此时文件刚好读完最后一个数据(将其保存在x中)

    但是,这时fin.eof()仍为假,因为 fin流的标志eofbit是False,fin流此时认为文件还没有到末尾,只有当流再次读写时 fin>>x ,发现已无可读写数据,此时流才知道到达了结尾,这时才将标志eofbit修改为True,此时流才知道文件到了末尾。

    也就是说,eof在读取完最后一个数据后,仍是False,当再次试图读一个数据时,由于发现没数据可读了,才知道到末尾了,此时才修改标志,eof变为True。

    以下例子:

    ifstream fin("D://line.txt");

    ofstream fout("D://T_line.txt", ios::trunc);

 

    list<tag_Point> test_list;

    tag_Point test;

 

    whlie( !fin.eof() )

    {

        fin>>test.x;

        fin>>test.y;

        fin>>test.z;

 

        test_list.push_back(test);

    }

 

    fin.close();

 

    在运行时,发现test_list中的数据比文本中的数据多一行,也就是文本中最后一行的数据写了两遍。

    最终找到了一个解决方法,现在把上面的代码改为如下:

    #include <iostream>

    #include <stdlib.h>

    #include <fstream>

 

    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://blog.csdn.net/shuilan0066/archive/2009/10/14/4669451.aspx

              http://hi.baidu.com/cdever/blog/item/549cb01f1fc0eecca7866985.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值