关注嵌入式安卓物联网行业及人才培养,每日更新,欢迎订阅及留言讨论~~~
作者:倪键树,嵌入式安卓物联网讲师。
fgetc与EOF的错综复杂关系
1、fgetc对字节的读取
在正常的情况下,fgetc 以 unsigned char 的方式读取文件流,扩展为一个整数,并返回。换言之,fgetc 从文件流中取一个字节,并加上24个零,成为一个小于256的整数,然后返回。
int c;
while ((c = fgetc(rfp))!= -1) // -1就是 EOF
fputc (c,wfp);
解析:上面 fputc 中的 c 虽然是整数,但在 fputc将其写入文件流之前,又把整数的高24位去掉了,因此 fgetc,fputc 配合能够实现文件复制。到目前为止,把 c 定义为char仍然是可行的,但下面我们将看到,把 c 定义为 int 是为了能正确判段文件是否结束的,而char则不能判断文件是否结束。
2、判断文件结束
多数人认为文件中有一个EOF,用于表示文件的结尾。但这个观点实际上是错误的,在文件所包含的数据中,并没有什么文件结束符。对fgetc 而言,如果不能从文件中读取,则返回一个整数 -1,这就是所谓的EOF。返回 EOF 无非是出现了两种情况,一是文件已经读完; 二是文件读取出错,反正是读不下去了。
注意:在正常读取的情况下,返回的整数均小于256,即0x0~0xFF。而读不出返回的是(-1)0xFFFFFFFF。但是假如你用