C语言中关于feof函数fgetc函数一些理解
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函数一些理解相关推荐
- C 语言中的 feof()函数
功能: feof 是 C 语言标准库函数函数,其原型在 stdio.h 中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被 clearerr() 清除. 用法: ...
- c语言fputc用法,fputc 和fgetc 函数
C语言 的 fputc 和fgetc 函数 fputc()函数用于将单个字符写入文件.它将一个字符输出到流. fputc()函数的语法: int fputc(int c, FILE *stream) ...
- c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...
C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...
- C语言中的字符串转数字函数常见问题详解
目录 C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 字符串转长整形 strtol函数, C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 函数原型: int a ...
- C语言中求字符串长度的函数my_strlen()的几种实现方法
C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) {asse ...
- c语言常用数学函数大全查询,C语言数学函数 C语言中全部可用的数学函数有哪些?...
导航:网站首页 > C语言数学函数 C语言中全部可用的数学函数有哪些? C语言数学函数 C语言中全部可用的数学函数有哪些? 相关问题: 匿名网友: /*--------------------- ...
- c语言中如何定义一个pos函数,c语言中函数 Pos(40, 12);是什么意思?
2019-11-26 回答 有两种理解.(1)库函数是c语言的内部函数或自带函数,外部函数即程序员自定函数. (2)凡加写了extern 的函数是外部函数. 第一种理解好懂: c语言的内部函数指的是c ...
- c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)
1.strcpy() 在字符串拷贝函数中,它的函数编写不难,如下 char* Strcpy(char* dest, const char* src) { assert(dest != NULL &am ...
- c语言中执行一次的函数once,iOS只执行一次的方法
IOS开发(64)之GCD任务最多只执行一次 1 前言 使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始 ...
最新文章
- SQL Sever 2008 R2 数据库(2) ——数据库管理
- 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.
- Angular Observable数据类型的单元测试数据准备
- 20172315 2017-2018-2 《程序设计与数据结构》第九周学习总结
- ADO.Net之SqlConnection、 Sqlcommand的应用(读书笔记1)
- 烂泥:centos6.4服务器添加新硬盘
- java+swing+教科书,java+Swing+学生事务管理系统
- 【GIS】GIS概念
- 14Penrose广义逆(II)
- Microsoft Visual Studio--- 未能加载文件 %CommonDir%\dte90a.olb。未能找到该文件,因此解决此问题的尝试,请重新安装此程序。
- Ralph and Mushrooms (tarjan+dp)
- guzzlehttp5.3 and guzzlehttp6.7 , 同时共存。同时安装2个版本guzzlehttp
- c语言入门题目:输出两行短句
- ftp上传工具 免安装,ftp上传工具 免安装绿色破解版好用推荐
- ubuntu上网显示找不到服务器,解决ubuntu中firefox浏览器总是提示找不到服务器的问题...
- 《Mining Quality Phrases from Massive Text Corpora》论文学习笔记
- 数字孪生智慧医院:构建三维人体监测可视化管理平台(三)
- stm8 IAR 编译错误atal Error[Pe035]: #error directive: quot;Please select first the target STM8L device
- PAT甲级 1068
- 华为OD入职一年介绍和建议
热门文章
- 金蝶系统服务器链接设置,金蝶更改服务器连接设置
- html5 drawimage参数,小程序中canvas的drawImage方法参数详解
- API精准定位IP地址
- 易误:#define SQR(X) (X)*(X)
- ‘xx.dll’should be excluded because its source file ‘...’is under Windows System File Protection.
- 贝叶斯分类(Bayesian)
- 「TCG 规范解读」初识云和 DICE 工作组
- requestPermissions读写手机存储权限_Android 11 开发者常见问题:存储|FAQ?第二期
- Gauge从入门到精通——[2]语法
- [游戏]求生之路服务器架设及插件