C feof

功能:检测流上的文件结束符。如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。

正确的应该是feof返回0表示文件没有结束,返回1,表示结束。
feof实际观察的是上次读操作的内容,也就是上次读操作fread返回的值,如果读操作的返回值表明读取的不是空,那feof就返回0,如果上次读操作失败了,则feof返回1,表示读取完了。而fread返回值是表示正确读取的块数,如果不够,则返回0。那么我们看一下下面的程序:
while(1){
  if(feof(fp1))

  {
    break;
  }
  tmpint=fread(&(tmp[k]),1,1,fp1);
  k++;
}
如果fp1指向的文件有256个字节,那么运行结束后,k的值为257。原因是由于在fread读取k=255的时候,文件其实就应该完了,但是fread在k=255这次读取中,其返回值是1,因此进入k=256循环后,feof仍然返回的是0。因此k++也会再执行一次,因此,k变成了257。当进入k=257循环内,feof发现上次读操作失败了,因为上次fread返回了0,此刻break。最后k=257,比实际的文件大小大了一。所以在用feof的时候要多多注意。

C feof,布布扣,bubuko.com

时间: 2024-10-18 22:41:18

C feof的相关文章

文件流:"fopen","fclose",“ftell”"fseek","fgets","fprintf" ,“feof”,"fwrite","fread"

char const* filename="D:/hello.txt"; "fopen", FILE *fp=fopen(char const *name,char const mode); e.g:FILE *fp = fopen(filename,"wb"); 打开文件流,name为要打开文件的路径,如这里的filename:mode 为对文件的操作模式,通常使用:"wb"(写操作),"rb"(读操作)

8.6 文件IO fflush fseek ftell rewind feof ferror

fprintf()  . sprintf. snprintf : int fprintf(FILE *stream, const char *format, ...); int sprintf(char *str, const char *format, ...); int snprintf(char *str, size_t size, const char *format, ...); #include <stdio.h> int main() { FILE * fp = fopen(&q

(转)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()

feof判断到结尾了 fgets还是获取一行空的 导致多读取一行

Downloads Documentation Get Involved Help PHP 5.4.35 Released fflush » « fclose PHP 手册 函数参考 文件系统相关扩展 Filesystem Filesystem 函数 Change language:               English               Brazilian Portuguese               Chinese (Simplified)               F

文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets

clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * stream); 函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标. 返回值 fclose(关闭文件) 相关函数 close,fflush,fopen,setbuf 表头文件 #include<stdio.h> 定义函数 int fclose(FILE * stream); 函数说明 fclos

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

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

feof读字符串问题

feof()函数是我们在C语言中操作文件经常用到的一个函数.这个函数用来表示我们是否已经到了文件的末尾的下一个位置.不管是二进制文件,还是文本文件它都管用.对比EOF(一般宏定义为-1),EOF只能用来判断文本文件是否到达末尾,因为文本文件中的数字是用ASCII表示的,ASCII字符的取值范围是0~255.而二进制文件中可能存在-1,所以不能用EOF来判断结束. 我们使用feof经常遇到的一个问题是,用fgets读文件,然后用fputs打印.最后一行会打印两遍. 这是为什么了? 先说一下feof

判断文件结束,feof……

因为文本文件中存储的是ASCII码,而ASCII码中FF代表空值(blank),一般不使用,所以如果读文件返回了FF,说明已经到了文本文件的结尾.但是如果是二进制文件,其中可能会包含FF,因此不能把读到EOF作为文件结束的条件,此时只能用feof()函数. 在VC里,只有当文件位置指针(fp->_ptr)到了文件末尾,然后再发生读/写操作时,标志位(fp->_flag)才会被置为含有_IOEOF.然后再调用feof(),才会得到文件结束的信息.因此,如果运行如下程序: char c; whil

判断文件结束函数 feof

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