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

  • 前言
  • 问题
  • 解决

前言

在使用C语言来对文件操作的时候,我们经常使用一些feof、fgetc函数,但是在使用的过程中也会遇到一些小问题。

问题

在今天编写C语言时候,我写了如下一段代码:

#include <stdio.h>int main(){FILE *fp = fopen("code.txt","r");if (fp != NULL){while (!feof(fp)){printf("%c",fgetc(fp));}}elseprintf("fail to open!");fclose(fp);return 0;
}

code.txt:

if else then a1 abc 22

看上去貌似没什么问题,这是一段输出code.txt文件内所有字符的一个小程序。
我来用图片指出一下实际出现的问题:


可以看到,程序输出的结果比txt文件的字符多出了一个?符号。

解决

经过查阅相关资料发现,fgetc函数在,传入参数fp到达文件末尾的时候,会返回一个EOF,这个EOF的实值是-1。
那么会不会是fgetc函数多输出了一遍呢?循环到达文件末尾没有停止,而是把最后的EOF也输出了?
我添加了两行代码,实验了一下:

#include <stdio.h>int main(){FILE *fp = fopen("code.txt","r");putchar(-1);printf("\n");if (fp != NULL){while (!feof(fp)){printf("%c",fgetc(fp));}}elseprintf("fail to open!");fclose(fp);return 0;
}

结果果然:

-1 的输出结果果然就是这个?符号,也就是说,循环多走了一遍,才结束,导致EOF被当作字符输出了。
在查阅相关资料后得到如下的经验:

feof函数的判断方法不是判断当前指针是否指向文件末尾,而是根据上一次读取的返回值进行判断,如果上一次读取的返回值为EOF,那么feof(fp)为真,否则为假。

而fgetc函数的方法刚好是:先读取当前指针指向的内容,再让指针向后移。

这样一来,刚好,如果两者放在一起操作,就会发生多读一个EOF的现象:
getc在读到txt文档最后一个字符的时候,fp指向最后一个字符,读出字符后,fp向后移,fp指向EOF,进行下一次循环,feof判断是否到达文档末尾:由于上一次fgetc读出的是文档最后一个字符,所以即使fp当前已经指向了EOF,feof函数还是会返回假,这样循环就又继续了,下一次循环中,就会将fp指向的EOF输出,fp后移(已经到达文档尾,无法后移);

所以,我将代码改为了这种:

#include <stdio.h>int main(){FILE *fp = fopen("code.txt","r");if (fp != NULL){char ch = fgetc(fp);while (!feof(fp)){putchar(ch);ch = fgetc(fp);}}elseprintf("fail to open!");fclose(fp);return 0;
}

输出结果就是正常的:

C语言中关于feof函数fgetc函数一些理解相关推荐

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

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

  2. c语言fputc用法,fputc 和fgetc 函数

    C语言 的 fputc 和fgetc 函数 fputc()函数用于将单个字符写入文件.它将一个字符输出到流. fputc()函数的语法: int fputc(int c, FILE *stream) ...

  3. c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...

  4. C语言中的字符串转数字函数常见问题详解

    目录 C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 字符串转长整形 strtol函数, C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 函数原型: int a ...

  5. C语言中求字符串长度的函数my_strlen()的几种实现方法

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) {asse ...

  6. c语言常用数学函数大全查询,C语言数学函数 C语言中全部可用的数学函数有哪些?...

    导航:网站首页 > C语言数学函数 C语言中全部可用的数学函数有哪些? C语言数学函数 C语言中全部可用的数学函数有哪些? 相关问题: 匿名网友: /*--------------------- ...

  7. c语言中如何定义一个pos函数,c语言中函数 Pos(40, 12);是什么意思?

    2019-11-26 回答 有两种理解.(1)库函数是c语言的内部函数或自带函数,外部函数即程序员自定函数. (2)凡加写了extern 的函数是外部函数. 第一种理解好懂: c语言的内部函数指的是c ...

  8. c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)

    1.strcpy() 在字符串拷贝函数中,它的函数编写不难,如下 char* Strcpy(char* dest, const char* src) { assert(dest != NULL &am ...

  9. c语言中执行一次的函数once,iOS只执行一次的方法

    IOS开发(64)之GCD任务最多只执行一次 1 前言 使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始 ...

最新文章

  1. SQL Sever 2008 R2 数据库(2) ——数据库管理
  2. 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.
  3. Angular Observable数据类型的单元测试数据准备
  4. 20172315 2017-2018-2 《程序设计与数据结构》第九周学习总结
  5. ADO.Net之SqlConnection、 Sqlcommand的应用(读书笔记1)
  6. 烂泥:centos6.4服务器添加新硬盘
  7. java+swing+教科书,java+Swing+学生事务管理系统
  8. 【GIS】GIS概念
  9. 14Penrose广义逆(II)
  10. Microsoft Visual Studio--- 未能加载文件 %CommonDir%\dte90a.olb。未能找到该文件,因此解决此问题的尝试,请重新安装此程序。
  11. Ralph and Mushrooms (tarjan+dp)
  12. guzzlehttp5.3 and guzzlehttp6.7 , 同时共存。同时安装2个版本guzzlehttp
  13. c语言入门题目:输出两行短句
  14. ftp上传工具 免安装,ftp上传工具 免安装绿色破解版好用推荐
  15. ubuntu上网显示找不到服务器,解决ubuntu中firefox浏览器总是提示找不到服务器的问题...
  16. 《Mining Quality Phrases from Massive Text Corpora》论文学习笔记
  17. 数字孪生智慧医院:构建三维人体监测可视化管理平台(三)
  18. stm8 IAR 编译错误atal Error[Pe035]: #error directive: quot;Please select first the target STM8L device
  19. PAT甲级 1068
  20. 华为OD入职一年介绍和建议

热门文章

  1. 金蝶系统服务器链接设置,金蝶更改服务器连接设置
  2. html5 drawimage参数,小程序中canvas的drawImage方法参数详解
  3. API精准定位IP地址
  4. 易误:#define SQR(X) (X)*(X)
  5. ‘xx.dll’should be excluded because its source file ‘...’is under Windows System File Protection.
  6. 贝叶斯分类(Bayesian)
  7. 「TCG 规范解读」初识云和 DICE 工作组
  8. requestPermissions读写手机存储权限_Android 11 开发者常见问题:存储|FAQ?第二期
  9. Gauge从入门到精通——[2]语法
  10. [游戏]求生之路服务器架设及插件