EOF与feof()
来源:互联网 发布:kvm ubuntu 使用 编辑:程序博客网 时间:2024/06/06 15:41
http://blog.chinaunix.net/uid-20676256-id-109893.html
判断文件结束有两种方法:EOF和feof()
查看stdio.h可以看到如下定义:
#define EOF (-1)
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)
由此可以看出,这两种方式的原理是不同的。
有人说EOF只能用于文本文件,其实不然,还要看定义的变量的类型。下面这段程序对文本文件和二进制文件都可以:
int c;
while((c=fgetc(fp)) != EOF)
{
printf("%X\n", c);
}
如果读到了FF,由于c定义为int型,所以实际上c=0x000000FF,不等于EOF(-1=0xFFFFFFFF),因此不会误判为文件结尾。
但是如果把c定义为char类型,就有可能产生混淆了。
char c;
while((c=fgetc(fp)) != EOF)
{
printf("%X\n", c);
}
因为文本文件中存储的是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()。
- EOF与feof()
- feof与EOF
- EOF 与 feof()
- 谈谈EOF与feof()
- EOF与feof()
- EOF与feof()
- EOF与feof()函数关系
- EOF feof()
- EOF与feof(),文件末尾的判定方法
- feof()函数和EOF结束符的区别与联系
- fgets()、gets()、EOF、feof()
- EOF 和 feof()
- EOF和feof
- feof()函数以及EOF
- EOF和feof(FILE *)
- C中的 feof() 和 EOF
- <转>feof()和EOF用法
- 文件结尾判断feof , EOF
- IDEA阅读Spark源码
- 《javascript高级程序设计》读书笔记(三)变量、作用域和内存问题
- Android 学习笔记2
- 关于C++的隐藏规则
- Java程序员的JavaScript学习笔记(6——面向对象模拟)
- EOF与feof()
- 学生课堂经验值管理系统2
- PAT(A) 1061 (与PAT(B) 1014相同题目)
- An Introduction to Interactive Programming in Python 第五课作业 memory
- Android 之 远程图片获取和本地缓存
- 消除字符串开始和结束处的空格,并合并中间多余的空格
- android for android 混淆
- MAC中设置android adb环境变量
- 【无限互联】学员作品:中关村在线iOS客户端