判断文件结束,feof……

因为文本文件中存储的是ASCII码,而ASCII码中FF代表空值(blank),一般不使用,所以如果读文件返回了FF,说明已经到了文本文件的结尾。但是如果是二进制文件,其中可能会包含FF,因此不能把读到EOF作为文件结束的条件,此时只能用feof()函数。

在VC里,只有当文件位置指针(fp->_ptr)到了文件末尾,然后再发生读/写操作时,标志位(fp->_flag)才会被置为含有_IOEOF。然后再调用feof(),才会得到文件结束的信息。因此,如果运行如下程序:

char c;
while(!feof(fp))
{
    c = fgetc(fp);
    printf("%X\n", c);
} 

会发现多输出了一个FFFFFFFF,原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FFFFFFFF)。 正确的写法应该是:

char c;
c = fgetc(fp);
while(!feof(fp))
{
    printf("%X\n", c);
    c = fgetc(fp);
}  

这么说其实feof()是可以用EOF来代替的喽?不是,这里还有一个问题。fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。因此我们无法确信文件已经结束, 因为可能是读取错误! 这时我们需要feof()。

时间: 2024-12-19 06:49:45

判断文件结束,feof……的相关文章

判断文件结束函数 feof

在上一节例2中,程序从一个文件中逐个读取字符并输出到屏幕上显示,在 while 循环中以 EOF 作为文件结束的标志.这种以 EOF 作为文件结束标志的文件,必须是文本文件.在文本文件中,数据都是以字符的 ASCII 码值的形式存放.我们知道,ASCII 码值的范围是 0~255,不可能出现 -1,因此可以用 EOF 作为文件结束的标志. 当把数据以二进制形式存放到文件中时,就会有 -1 值的出现,此时不能采用 EOF 作为二进制文件的结束标志.为解决这一问题,ANSI C 提供一个 feof

使用feof()判断文件结束时会多输出内容的原因

这是原来的代码: #include <stdio.h>int main(){    FILE * fp;    int ch;    fp = fopen("d:\\aaaaa\\1.txt","r");    while (!feof(fp))    {        ch = getc(fp);        putchar(ch);    }    fclose(fp);    return 0;} 以此来输出时会发现好像输出的内容在结尾部分多了一

文件结束的判断和结束符的理解

转载自:http://blog.csdn.net/zhy10/article/details/1562649 转载自:http://blog.csdn.net/sambian/article/details/644360 EOF,即end of file,文件结尾,作为文件结束的标志,在程序中常作为判断的一个标志.但在我们平常的程序中却常发生意想不到的结果.下面这段程序,猜猜它输出的是什么?char c;ifstream fin("d://dat");//设d:/dat文件已存在,内容

判断文件的错误与结束状态

一.标准文件编程库用于文件状态的函数:#include <stdio.h>1.int ferror(FILE* stream);//只是用来判断错误是否发生,不能明确错误的内容当文件IO 发生错误时,ferror返回非0,成功返回02.int feof(FILE* stream);//只是用来判断错误是否发生,不能明确错误的内容当文件结束时,feof返回非0,否则返回0//使用上面俩函数://读取文件,当文件结束时自动退出int main(){    FILE* fp;    char buf

转载 - C++ - 关于ifstream/fstream流 判断文件是否结束eof()的问题

出处:http://blog.csdn.net/shuilan0066/article/details/4669451 在做实验的时候遇到这个问题,找原因的时候发现出处除了讲明原因,还举了例子,所以记下来. 其实在循环判断文件是否结束的时候可以直接就流输入放在循环条件那里,但是这里补充使用eof()的一些细节问题.其实这是关于到底什么时候标志位才会变化的问题.总结起来就是只有使用一次流变量来输入输出,标志位才会更新一次. 正文: fstream流的eof()  判断有点不合常理 按正常逻辑来说,

读文件使用feof()多读一次的问题

读文件使用feof()多读一次的问题 这是一个经典的错误, 很多教科上都是这么写的.  在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾.直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾.这样就多执行了一次.  对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断.  而我们经常这样把它使用在循环中: int c;   while(!feof(fp))   {     

cin判断读取结束 C++语言

cin是C++的输入流,可以通过>>进行读取. 判断读取结束,一般有两种方法,具体取决于与输入的约定. 1 以特殊值结尾. 如输入整数,以-1结束,那么当读到-1的时候,就确定读取结束了. 代码: int n; while(1) {     cin>>n;     if(n == -1)break;     //处理输入的合法值. } 2 以EOF结尾,即文件结束符. 这种处理方式适用于以文件作为输入,或者在键盘手动输入文件结束符作为结尾标记. 代码: int n; while(c

UNIX环境编程学习笔记(6)——文件I/O之判断文件类型

lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: (1) 普通文件(regular file) 这种文件包含了某种形式的数据,这些数据无论是文件还是二进制对于 UNIX 内核而言都是一样的.对普通文件内容的解释有处理该文件的应用程序进行. (2) 目录文件(directory file) 目录文件包含了其他文件的名字以及指向与这些文件有关信息的指

Python中如何判断文件是否存在?

通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 本文为大家介绍三种判断文件或文件夹是否存在的方法,分别使用 os模块 . Try语句 . pathlib模块 ,一起来看看吧,希望对大家学习python有所帮助. 1.使用os模块 os模块中的 os.path.exists() 方法用于检验文件是否存在. · 判断文件是否存在 import osos.path.exists(test_file.txt)#True o