zoukankan      html  css  js  c++  java
  • C++之EOF()

        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

  • 相关阅读:
    Python 字符串
    python 元组用法
    python 字典用法
    环境配置
    桥式整流以及电容作用
    三角序列的正交性
    MDS
    ISOMAP
    randperm
    数据库~Mysql里的Explain说明
  • 原文地址:https://www.cnblogs.com/blfshiye/p/3795349.html
Copyright © 2011-2022 走看看