您好,欢迎访问三七文档
在C语言中经常用EOF和feof()来判断文件的结束,现将有关用法总结如下:1.定义EOF是EndOfFile的缩写,是c语言中标准库中定义的宏,定义为:#defineEOF(-1);feof()用于测试流文件的结束,有宏和函数两种定义:宏定义:#definefeof(_stream)((_stream)-_flag&_IOEOF),其中_IOEOF的为:#define_IOEOF0x0010函数定义:intfeof(FILE*stream);2.说明EOF的值为-1,是int类型数据,在32位系统中,可以表示为0xFFFFFFFF;EOF不是一个字符,也不是文件中实际存在的内容。EOF不但能表示读文件到了结尾这一状态,它还能表示I/O操作中的读、写错误(可以用ferror()来检测)以及其它一些关联操作的错误状态;feof()只用于测试流文件的结束,当到达结尾时,返回非0;当文件内部位置指针指向文件结束时,并未立即置位FILE结构中的文件结束标记,只有再执行一次读文件操作,才会置位结束标志,此后调用feof才会返回为真。函数如fgetc或getc返回EOF并不一定表示文件结束,当读取文件出错时也会返回EOF,仅凭返回-1就认为文件结束是错误的;正因为如此,我们需要feof()来判断文件是否结束,当然用feof()来判断文件结束时也需要判断读取操作是否出错,这时可以用ferror()来判断,当其为真时表示有错误发生。在实际的程序中,应该每执行一次文件操作,就用用ferror函数检测是否出错。3.举例假设文件指针fp指向某个文件,文件中有字符串“hello”,下面的代码将输出hello外,还将输出一个结束字符EOF(EOF是fgetc函数的返回值,并不是文件中存在EOF):intc=0;while(!feof(fp)){intc=fgetc(fp);printf(%c:/t%x/n,c,c);}其原因就是当内部指针指向结尾时,还要执行一次读操作,文件结束标记才置位,而下面的代码将只输出“hello”不输出文件结束符:intc;c=fgetc(fp);while(!feof(fp)){printf(%c:/t%x/n,c,c);c=fgetc(fp);}当文件内部指针指向结束位置时,先执行一次读操作,置位文件结束标记,while循环立即结束。while(!feof(fp)){fscanf(fp,%d,&n);if(!feof(fp)){//加入这行判断,否则会多读一次最后一行g-vexs[t].data=n;t+=1;}}返回值010代表没到文件尾1代表到文件尾了while(!feof(in))是说如果没到文件尾就继续若到文件尾了结束循环自己测试过的代码,不需要在循环里面再判断feof(),跟查到的资料有出入。//进行循环读取while(!feof(fpSrc))//判断文件是否已结束;!feof(fpSrc){memset(Src_buf,0,MAXSIZES);memset(Des_buf,0,MAXSIZES);fgets(Src_buf,MAXSIZES,fpSrc);//if(!feof(fpSrc))//{Substitute(Src_buf,Des_buf,ps,pd);fputs(Des_buf,fpDes);//}}
本文标题:文件操作
链接地址:https://www.777doc.com/doc-4764689 .html