以linux平台下的vim创建的文件为例,当读取指定文件中的内容时,文件的格式为:

内容+EOF 

其中 EOF为vim文件内容的结束标志。

每当用C语言读取文件内容时,文件指针要指向字符EOF之后才能判断文件已经结束。所以EOF内容会被读取,读取到的EOF通常会给我们带来困扰,如输出时会多输出一行。

为了解决多读取的EOF字符(在文件中不可见),我们用一个小小的逻辑算法来避免EOF字符带来的困惑,如打印读取的文件内容时不将读取到的EOF字符输出,或避免在读取到EOF字符(读取此字符不成功)后无判断文件是否结束的操作而又将上一次读取到的数据输出。

1.文件指针 文件内容

如data.in文件中的内容如下:

12345678

23456789

那么当用指针打开此文件并用相关的C语言文件操作函数来读取这个文件时,C语言文件指针执行过程(移位)如下:

  • 当打开文件时,文件指针指向文件中的第一个字符

如FILE *fp = fopen("data.in", "r");要是打开data.in文件成功之后,文件指针fp就会指向文件中的第一个字符:'1'。

  • 每根据 要求(读一个字符,一行字符串等) 读取一次文件内容时,文件指针将指向下一个(临近)的字符。

如data.in中的内容,此时用fgets(ar, 100, fp);语句后(读取文件中的一行字符串),文件指针将指向下一行的字符:'2'

  • 当文件指针指向EOF时,并不会认为文件内容已经结束。当指针指向EOF后一位时(把EOF读取后),此时文件内容才算结束。

如在data.in中,把字符'9'成功读取后,文件指针指向EOF字符。此时若判断文件是否结束,则不为结束;只有把EOF字符读取之后(文件指针指向EOF后时),再判断文件是否结束时,才会判断为结束。

2.正确使用feof()

#include <stdio.h>#define SIZE            100
#define FILENAME        "data.in"int main(void)
{int     ln;FILE    *fp;char    ar[SIZE];ln      = 0;if( (fp = fopen(FILENAME, "r") ) == NULL){printf("Can not open file: %s\n", FILENAME);return -1;}while( !feof(fp) ){fgets(ar, SIZE, fp);//If read EOF,//Do not record the line`s number,//Do not print the content to screenif( feof(fp) ){break;}ln++;printf("%s", ar);}printf("The file`s line is %d\n", ln);fclose(fp);return 0;
}

这是一个打开与本源程序在同一个目录下叫data.in文件的程序。并读取data.in中的全部内容,并统计行数。

data.in中的内容如1中所述。

编译、运行此程序后的结果为:

12345678
23456789
The file`s line is 2

分析结果:

(1)此程序将data.in中可见内容照样输出(用fgets函数读取文件内容时,ar数组已经包含回车符,故不需要在printf打印语句中再添加回车),并正确统计了其内容行数。

(2)能正确将文件内容输出的关键语句是"if( feof(fp) ){break;}"需要将此语句加在"行数自增,打印行内容(ln++;printf("%s", ar))"语句之前。

3.非正确使用feof()

若将2中代码中的"if( feof(fp) ){break;}"语句去掉或者是写到"ln++;printf("%s", ar)"之后,则程序将不会得到预期效果。

a.将2中代码中的"if( feof(fp) ){break;}"语句去屏蔽,再编译运行程序得到结果:

12345678
23456789
23456789
The file`s line is 3
b.将将2中代码中的"if( feof(fp) ){break;}"语句写到"ln++;printf("%s", ar)"语句之后,再编译运行程序得到结果:

12345678
23456789
23456789
The file`s line is 3

分析结果:

造成a,b结果的原因在于:当读取EOF字符时,文件指针已经指向EOF之后,但此时没有进行读取文件内容是否结束的判断,从而没有进一步中断while循环,使fgets()函数读取EOF字符读取失败(不能讲字符EOF读入到数组ar中),从而ar数组里面的内容还是上一次读取的内容。所以当输出ar时,ar的值为上一次字符串值,并且ln++语句得以执行。故而是多输出文件中最后一行数据的结果!

总结:

在用非手动输入数据的程序手段进行数据的获取时(如读文件时,需要结合文件内容格式和相应函数功能(操作过程)来获取准确的数据)。有时候一字符只差,全程序皆输也!

Note Over。

C中的 feof() 和 EOF相关推荐

  1. C语言中关于feof函数fgetc函数一些理解

    C语言中关于feof函数&fgetc函数一些理解 前言 问题 解决 前言 在使用C语言来对文件操作的时候,我们经常使用一些feof.fgetc函数,但是在使用的过程中也会遇到一些小问题. 问题 ...

  2. C 语言中的 feof()函数

    功能: feof 是 C 语言标准库函数函数,其原型在 stdio.h 中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被 clearerr() 清除. 用法: ...

  3. Linux 中的 EOF 到底是什么?

    转载自:http://woshijpf.github.io/2016/07/07/Linux%E4%B8%AD%E7%9A%84EOF%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB ...

  4. C语言中的EOF和feof()

    在c语言中经常用EOF和feof()来判断文件的结束,现将有关用法总结如下: 定义 EOF是End Of File 的缩写,是c语言中标准库中定义的宏,定义为:#define  EOF  (-1):  ...

  5. feof()函数以及EOF

    c 中的feof()函数,用来检测当前文件流上的文件结束标志,判断是否文件的尾部. 函数int feof(FILE *fp) 检测到文件结束符则返回一个非0值,否则返回0. Note:当文件内部的位置 ...

  6. EOF feof()

    >> 关于文件结束符EOF EOF 是 End Of File 的缩写. 在 C 语言中,它是在标准库中定义的一个宏. 人们经常误认为 EOF 是从文件中读取的一个字符.其实,EOF 不是 ...

  7. linux socket eof,Linux 中的 EOF 到底是什么?

    EOF 的定义 EOF 是 end of file 的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(s ...

  8. c 语言中eof 是什么,什么是C编程语言中的EOF?

    从终端输入不会真的"结束"(除非设备已断开连接),但在终端中输入多个"文件"是有用的,因此键序列被保留以指示输入结束.在UNIX中,按键到EOF的转换由终端驱动 ...

  9. python中的eof错误_python – 解析器YACC中的EOF错误

    我试图使用PLY库中为Python提供的yacc解析器来解析字符串. 解析器本身很长,但我遇到的问题是它总是给我同样的错误,无论我放什么样的字符串. 错误是这样的: yacc:输入中的解析错误. EO ...

最新文章

  1. 使用RDLC报表向报表传入参数
  2. explicit关键字详解(C++ )
  3. 我的2021年终总结:初为人父,从头再来
  4. prd展示html文件,prd目的.html
  5. 数据库连接失败报错com.mysql.cj.jdbc.exceptions.CommunicationsException
  6. 【Vue2.0】—vue-router(二十六)
  7. Python如何从社交用户信息中寻找潜在客户?
  8. Linux解决忘记密码的方法
  9. 启用 Windows 审核模式(Audit Mode),以 Administrator 账户来设置电脑的开箱体验
  10. matlab2016环境变量,matlab环境变量path
  11. 基于改进Bisenet的五官精确分割系统(源码&教程)
  12. 「解析」正则化 DropPath
  13. MediaSession和MediaSessionService的交互流程梳理
  14. INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法
  15. 在windows上编译apr库apr-util库
  16. 432偏计算机编程,统计学考研432笔记
  17. 线性代数(19)——行列式(下)
  18. 1到10加法创新图片-走迷宫_B站游戏重点新作《刀剑神域》手游,公布首月预约达110万...
  19. Week 7 - Distributional Representations(分布表示)
  20. 【FTP】FTP主动模式与被动模式

热门文章

  1. Appium: Windows系统桌面应用自动化测试(二)
  2. 10Mbps是多少网速呢
  3. 面试知识点-网络——HTTP与TLS
  4. 联想装win7驱动遇到问题的解决
  5. 计算机网络基础知识总结及思维导图(一)概述
  6. LTI连续系统零状态响应求解
  7. vue中created、mounted、activated的区别
  8. pytorch神经网络实现
  9. Hadoop应用案例分析
  10. Vue中使用tailwindcss