当前位置: 首页 > news >正文

C语言之文件操作(剩余部分)

上篇博客字数到极限了,给大家把内容补充在这一篇,我们还剩下文件读取结束的判定和文件缓冲区的内容没有介绍,让我们开始下面的学习吧!


目录

1.文件读取结束的判定

1.1feof函数

1.2ferror函数

代码示例

2.文件缓冲区

2.1fflush函数

代码示例


1.文件读取结束的判定

关于文件读取结束,它到底是遇到错误结束的还是遇到文件结束标志而结束的需要我们进行判断,此时,我们一般用到两个函数feof函数和ferror函数,让我们来认识一下它们

1.1feof函数

1.函数功能:测试流(文件流或者标准输出流)上的文件结尾

2.头文件:#include<stdio.h>

3.使用格式:int feof( FILE *stream );

4.返回值:

如果尝试读取超过文件末尾的第一次读取操作之后返回一个非零值

如果当前位置不是文件末尾,则返回0

5.但是在我们使用这个函数时,经常有同学错误使用它,归根到底,还是对这个函数不熟悉所导致的,这就需要我们沉下心来,好好看清楚它的具体使用方法

在文件读取过程中,我们是不能用feof函数的返回值直接用来判断文件是否结束的

而是应该应用于当文件读取结束的时候,判断文件是因为读取失败结束还是遇到文件尾而结束

这也就是说,feof是来告诉你文件读取失败的原因的,而不是给你返回一个数值的

例如:

文本文件读取(输出)是否结束,若是使用fgetc函数要判断返回值是否为EOF

二进制文件的读取(输出)是否结束,若是使用fread函数,要判断它的返回值是否小于实际要读的个数

函数具体代码我们与ferror函数一起实现

1.2ferror函数

1.函数功能:测试流(文件流或者标准输出流)中的错误

2.头文件:#include<stdio.h>

3.使用格式:int ferror( FILE *stream );

4.返回值:

如果没有发生错误,ferror将返回0。

如果发生错误,它将返回一个非零值。

下面我们看段代码来加深理解

代码示例


//判断文本文件读取结束
int main()
{int c = 0;//以只读模式打开这个文本文件FILE* pf = fopen("test2.txt", "r");if (pf == NULL){perror("fopen");return 1;}//fgetc函数当读取文件失败或者遇到文件结束标志时,都会返回EOFwhile ((c = fgetc(pf)) != EOF){putchar(c);}printf("\n");if (ferror(pf))//文件读取失败遇到错误而结束printf("I/O error when reading");else if (feof(pf))//文件遇到结束标志而结束printf("End of file reached successfully");fclose(pf);pf = NULL;return 0;
}

运行结果

这就说明了,文件确实是因为遇到了文件结尾标志而结束的,而不是遇到了错误

我们总结一下:

feof:返回真,说明文件是正常遇到文件结束标志而结束的

ferror:返回真,说明是文件在读取过程中出错了而结束的

2.文件缓冲区

ANSIC标准采用“缓冲文件系统”来处理数据文件的

所谓缓冲文件系统是指系统自动的在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”

从内存向磁盘输出(写入)数据,会先把数据送到内存中的缓冲区,当装满缓冲区后,再从缓冲区一起送到磁盘

从磁盘向计算机输入(读取)数据,会先从磁盘文件中读取数据输入到内存缓冲区,充满缓冲区后,再从缓冲区逐个的将数据送到程序缓冲区

此外,缓冲区的大小是根据C语言编译系统决定的

此时,我们就知道了

数据并不是直接就可以放到磁盘文件中的,只有满足

1.缓冲区放满

2.主动刷新缓冲区

这两种的其中一个才会把数据放到磁盘文件中

这就又引出了一个新的函数fflush,它就是用来刷新缓冲区的函数,此时,大家可能就又会有疑问了,我们前面所写的代码示例也没有出现fflush函数,为什么就被写入文件了,这是因为fclose函数在关闭文件时,也会刷新缓冲区

因为有缓冲区的存在,C语言在操作文件时,需要刷新缓冲区域或者在文件操作结束时关闭文件,如果不这样做,可能导致文件读写失败,数据丢失,此外,缓冲区的大小是可以修改的,我们在这里不做太多说明,以后遇到在进行讲解

2.1fflush函数

1.函数功能:刷新缓冲区

2.头文件:#include<stdio.h>

3.使用格式:int fflush( FILE *stream );

4.返回值:

刷新成功:返回值为0,在指定的流没有缓冲区或只打开进行读取的情况下,也会返回值0

刷新失败:返回值EOF

我们来看个例子加深理解

代码示例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<errno.h>//测试缓冲区刷新函数int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("hello world\n", pf);//没有进行刷新,此时代码放在缓冲区printf("睡眠10s,我们已经写入数据了,打开对应的test.txt文件发现没有内容\n");Sleep(10000);printf("开始刷新缓冲区\n");fflush(pf);//此时,才将写入缓冲区的数据放到文件(磁盘)中printf("睡眠10s,此时,再次打开test.txt文件,文件中出现了被写入的内容\n");Sleep(10000);fclose(pf);//在关闭文件的同时,也会刷新缓冲区pf = NULL;return 0;
}

我们运行代码,它首先出现

然后我们打开对应文件,发现文件中确实没有内容,这也就证明了确实有缓冲区的存在

然后我们在返回程序代码运行窗口,此时出现提示

我们再次打开对应文件,发现文件中已经写入了内容


这就是C语言关于文件操作的全部内容了,这部分内容比较多,大家如果感兴趣的话,一定要戒骄戒躁,沉下心来认真学习,最重要的还是要多敲代码,巩固知识!

ok!大家下期再见!!!

http://www.lryc.cn/news/229077.html

相关文章:

  • 【PC】开发者日志:竞技比赛验证系统强化
  • c++用map,创建类似于python中的字典
  • VuePress介绍及使用指南
  • Spring-Security前后端分离权限认证
  • Django中Cookie和Session的使用
  • 云原生周刊:KubeSphere 3.4.1 发布 | 2023.11.13
  • 逐帧动画demo
  • Mongodb 中,与索引相关的监控指标
  • 图论14-最短路径-Dijkstra算法+Bellman-Ford算法+Floyed算法
  • OpenCV 实现透视变换
  • ChinaSoft 论坛巡礼|开源软件供应链论坛
  • VUE 组合式API
  • 尝试使用php给pdf添加水印
  • ubuntu上安装edge浏览器
  • 动态切换 Spring Boot 打包配置:使用 Maven Profiles 管理 JAR 和 WAR
  • 微信小程序使用阿里巴巴矢量图标
  • 使用JAVA pdf转word
  • 成都瀚网科技有限公司抖音带货的正规
  • windows服务器热备、负载均衡配置
  • samba服务器搭建 挂载远程目录 常用配置参数介绍
  • Ansible命令使用
  • element 周选择器el-date-picker
  • No200.精选前端面试题,享受每天的挑战和学习
  • 前端面试之事件循环
  • sass 封装媒体查询工具
  • 眼科动态图像处理系统使用说明(2023-8-11 ccc)
  • 国际阿里云:提高CDN缓存命中率教程!!!
  • 关于“谈谈你对 ES 的理解”
  • Element-Ui el-table 动态添加行
  • 深度学习 大数据 股票预测系统 - python lstm 计算机竞赛