zoukankan      html  css  js  c++  java
  • (转)C语言中的EOF和feof()

      今天遇到了feof()判断文件结束多输出一行的问题,在网上看到一篇写得比较好的文章,转过来(誊写一遍)加深印象。原文地址:http://blog.csdn.net/flyyyri/article/details/5084981  

    1、EOF是标准库中的宏定义,#define EOF -1,在32位系统中是int型数据,表示为0xFFFFFFFF,EOF 不是一个字符,也不是文件中实际存在的内容。EOF不但能表示读文件到了结尾这一状态,它还能表示 I/O 操作中的读、写错误(可以用 ferror() 来检测)以及其它一些关联操作的错误状态;

    2、feof()只用于测试流文件的结束,当到达结尾时,返回非0;当文件内部位置指针指向文件结束时,并未立即置位FILE结构中的文件结束标记,只有再执行一次读文件操作,才会置位结束标志,此后调用feof才会返回为真。

    下面是来自百度百科的一段说明:

      feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为非零值,否则为0。
      EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0xFF(十进制为-1),因此可以用EOF作为文件结束标志。
      当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。
     
    解决feof()函数多读一行的方法:
    1、举例来说,在循环末尾读入数据,在之前代码对读出的数据进行操作。
    假设文件指针fp指向某个文件,文件中有字符串“hello”,下面的代码将输出hello外,还将输出一个结束字符EOF(EOF是fgetc函数的返回值,并不是文件中存在EOF):
        int c=0;
        while(!feof(fp))
        {
            int c=fgetc(fp);
            printf("%c:	%x
    ",c,c);
        }
    View Code

    其原因就是当内部指针指向结尾时,还要执行一次读操作,文件结束标记才置位,而下面的代码将只输出“hello”不输出文件结束符:

        int c;
             c=fgetc(fp);    
        while(!feof(fp))
        {    
            printf("%c:/t%x/n",c,c);
            c=fgetc(fp);
        }
    View Code

    当文件内部指针指向结束位置时,先执行一次读操作,置位文件结束标记,while循环立即结束。

    2、一般情况下,多读一行没有多大影响,在循环外把最后一条记录删掉即可

  • 相关阅读:
    变量和值的延伸思考
    一念之想--多维数组
    java扫描控制台输入
    java字符转义
    javaee开发工具及环境配置过程
    java数组、泛型、集合在多态中的使用及对比
    flex的Accordion组件头部文本居中显示
    Visual Studio解决方案及项目的配置
    Away3D引擎学习入门笔记
    使用photoshop,把图片背景变成透明
  • 原文地址:https://www.cnblogs.com/nvbxmmd/p/4709480.html
Copyright © 2011-2022 走看看