• EOF与feof的区别


    查看 stdio.h 可以看到如下定义:

    #define  EOF  (-1)

    #define  _IOEOF  0x0010 
    #define  feof(_stream)  ((_stream)->_flag & _IOEOF)

    由此可以看出,这两种方式的原理是不同的。

    在这里先说下EOF和feof()这个两个宏定义,在我们学的课本中有这样的描述。

    EOF是不可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于EOF时,表示读入的已不是正常的字符而是文件结束符,但这适用对文本文件的读写。在二进制文件中,信息都是以数值方式存在的。EOF的值可能就是所要处理的二进制文件中的信息。这就出现了需要读入有用数据却被处理为“文件结束“的情况。为了解决这个问题,C提供了一个feof()函数,可以用它来判断文件是否结束。feof(fp)用于测试fp所指向的文件的当前状态是否为“文件结束”。如果是,函数则返回的值是1(真),否则为0(假)。

     根据数据的组织和操作形式,可以分为ASCII文件和二进制文件。

    ASCII文件又称为文本文件,它是在一个字节的存储单元上存放一个字符(在外存中存放的是该字符的ASCII码,每个字符将占一个字节)。

    二进制文件是把内存中的数据按其在内存中的存储格式在磁盘上原样保存。 

    对字符而言,由于其外存存储格式和内存表示格式相同,所以,在外存上也存放每个字符的ASCII码。

    但是说EOF只能用于文本文件,其实不然,这点不是特别的准确,还要看定义的变量的类型。

    下面这段程序对文本文件和二进制文件都可以:

    int c;
    while((c=fgetc(fp)) != EOF)
    {
        printf("%X/n", c); 
    }
    如果读到了FF,由于c定义为int型,所以实际上c=0x000000FF,不等于EOF(-1=0xFFFFFFFF),因此不会误判为文件结尾。

    但是如果把c定义为char类型,就有可能产生混淆了。
    char c;
    while((c=fgetc(fp)) != EOF)
    {
        printf("%X/n", c); 
    }
    因为文本文件中存储的是ASCII码,而ASCII码中FF代表空值(blank),一般不使用,所以如果读文件返回了FF,说明已经到了文本文件的结尾。但是如果是二进制文件,其中可能会包含FF,因此不能把读到EOF作为文件结束的条件,此时只能用feof()函数。

    奋斗为了更好的生活。
  • 相关阅读:
    python第十一天
    python第七天(字符编码,字符与字节,文件操作)
    python第六天(元组、字典、集合)
    python第五天
    python第四天
    根据数据库文件,查找对应的数据库
    Windows 路径问题
    32位及64位操作系统的程序问题
    好玩的获取目录信息的例子[C#]
    C# 反射相关的东西
  • 原文地址:https://www.cnblogs.com/redman274/p/12484717.html
Copyright © 2020-2023  润新知