使用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;
}

以此来输出时会发现好像输出的内容在结尾部分多了一个“空格”

这是改进后的代码:

#include <stdio.h>
int main()
{
    FILE * fp;
    int ch;
    fp = fopen("d:\\aaaaa\\1.txt","r");http://i.cnblogs.com/EditPosts.aspx?opt=1
    while (ch = getc(fp),!feof(fp))
    {
        putchar(ch);
    }
    fclose(fp);
    return 0;
}

会发现改进后的代码会正常输出文件的内容,而且不会在最后添加什么多余的东西

查资料发现,C语言的 feof() 函数返回的是最后一次“读操作的内容”。在未改进的代码中while循环判断的是上一次循环中 fgetc() 获取到的内容,这也就能解释未改进的代码为什么会在结尾多输出“内容”了。

时间: 2024-10-01 05:15:01

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

dedecms list 判断 每隔3次输出内容

{dede:list pagesize='12' runphp='yes'} [field:global name=autoindex runphp="yes"](@me%3==0)? @me='输出':@me='';[/field:global] {/dede:list} 花了好几个小时才解决,简直坑T,T dedecms list 判断 每隔3次输出内容,布布扣,bubuko.com

判断文件结束函数 feof

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

判断文件结束,feof……

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

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

一.标准文件编程库用于文件状态的函数:#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

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

转载自: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文件已存在,内容

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

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

C++:文件的输入和输出

1.共同的打开文件方式: fin.open("test.txt",ios::binary) fout.open("test.txt",ios::binary) fboth.open("test.txt",ios::in|ios::out|ios::binary) 或者 fistream fin("test.txt",ios::binary) fostream fout("test.txt",ios::bin

文件的输入和输出

文件的输入和输出 1.程序写入文件 ,应遵循以下规则(1)创建一个ofstream对象来管理输出流(2)将对象和输出流关联起来(3)以使用cout的方式来使用该对象.例如: ofstream fout ; //创建对象 fout.open(“jar.txt”) ; //关联文件 注意: Ofstream fout (“jar.txt”) ;//跟上面的两条语句是等效的那么关于第三点:使用cout的方式来使用该对象,比如: fout << “ I love you !”; 原因:fout对象的类

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