因为文本文件中存储的是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()。

最新文章

  1. centos安装禅道的步骤
  2. CentOS版本选择说明
  3. 【原创】C#搭建足球赛事资料库与预测平台(2) 数据库与XCode组件
  4. php接口post提交方法 。
  5. Android圆形图片--ImageView
  6. 把一个类(或者Object)转换成字典
  7. 【LeetCode从零单排】No15 3Sum
  8. Javascript 面向对象编程—封装
  9. PCL-安装
  10. agora入门案例
  11. SSL/TLS
  12. hdu4777 树状数组
  13. The query below helps you to locate tables without a primary key:
  14. Java编程的逻辑 (66) - 理解synchronized
  15. Android按钮事件的4种写法
  16. VB指针操作和消息钩子
  17. xxl_job springboot改造
  18. python-unittest学习2--生成报告
  19. [转]java设计模式
  20. 转:Linux 编译安装 Mysql5.7

热门文章

  1. 无法嵌入互操作类型“ESRI.ArcGIS.Display.SimpleFillSymbolClass”。请改用适用的接口。
  2. PHP文件下载原理
  3. linux内核链表分析
  4. hive学习笔记——表的基本的操作
  5. 自定义View(1)简单流程及示例模板
  6. [51NOD1105]第k大的数(二分答案)
  7. mac更新node
  8. 函数get_table_share
  9. UVa 11181 (条件概率) Probability|Given
  10. LeetCode Triangle 三角形(最短路)