当前位置: 首页 > 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!大家下期再见!!!

相关文章:

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

上篇博客字数到极限了&#xff0c;给大家把内容补充在这一篇&#xff0c;我们还剩下文件读取结束的判定和文件缓冲区的内容没有介绍&#xff0c;让我们开始下面的学习吧&#xff01; 目录 1.文件读取结束的判定 1.1feof函数 1.2ferror函数 代码示例 2.文件缓冲区 2.1fflu…...

【PC】开发者日志:竞技比赛验证系统强化

各位玩家大家好&#xff01;欢迎收看本期开发者日志。 在11月1日发布的第26赛季第2轮更新公告中&#xff0c;我们提到了有关强化比赛验证系统的内容。想必各位玩家一定会对我们加强验证系统的背景和意图感到好奇&#xff0c;为此我们想通过今天这篇反作弊开发者日志来向大家更详…...

c++用map,创建类似于python中的字典

1.创建 #include <map> #include <string> #include <iostream>using namespace std; int main() {/*using std::map;using std::string;using std::cout;*/map<string, string> myMap1 {{"Name", "ClearLove"},{"Gender&q…...

VuePress介绍及使用指南

VuePress是一个基于Vue.js的静态网站生成工具&#xff0c;它专注于以Markdown为中心的项目文档。VuePress具有简单易用的特性&#xff0c;同时提供了强大的自定义和扩展性。在本文中&#xff0c;我们将介绍VuePress的基本概念&#xff0c;并提供一个简单的使用指南。 什么是Vue…...

Spring-Security前后端分离权限认证

前后端分离 一般来说&#xff0c;我们用SpringSecurity默认的话是前后端整在一起的&#xff0c;比如thymeleaf或者Freemarker&#xff0c;SpringSecurity还自带login登录页,还让你配置登出页,错误页。 但是现在前后端分离才是正道&#xff0c;前后端分离的话&#xff0c;那就…...

Django中Cookie和Session的使用

目录 一、Cookie的使用 1、什么是Cookie&#xff1f; 2、Cookie的优点 3、Cookie的缺点 4、Django中Cookie的使用 二、Session的使用 1、什么是Session&#xff1f; 2、Session的优点 3、Session的缺点 4、Django中Session的使用 三、Cookie和Session的对比 总结 D…...

云原生周刊:KubeSphere 3.4.1 发布 | 2023.11.13

开源项目推荐 Inspektor Gadget Inspektor Gadget 是一组用于调试和检查 Kubernetes 资源与应用程序的工具&#xff08;或小工具&#xff09;。它在 Kubernetes 集群中管理 eBPF 程序的打包、部署和执行&#xff0c;包括许多基于 BCC 工具的程序&#xff0c;以及一些专为在 I…...

逐帧动画demo

用这一张图实现一个在跑的猎豹的动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X…...

Mongodb 中,与索引相关的监控指标

Mongodb为集合添加索引&#xff0c;能够提高查询的效率&#xff0c;减少查询过程中检索文档的数量&#xff0c;改变文档检索的方式。 索引&#xff0c;采用集合中的一部分数据&#xff0c;构建了B tree&#xff0c;支持mongodb的高效检索。除$indexStats命令外&#xff0c;mong…...

图论14-最短路径-Dijkstra算法+Bellman-Ford算法+Floyed算法

文章目录 0 代码仓库1 Dijkstra算法2 Dijkstra算法的实现2.1 设置距离数组2.2 找到当前路径的最小值 curdis&#xff0c;及对应的该顶点cur2.3 更新权重2.4 其他接口2.4.1 判断某个顶点的连通性2.4.2 求源点s到某个顶点的最短路径 3使用优先队列优化-Dijkstra算法3.1 设计内部类…...

OpenCV 实现透视变换

一&#xff1a;OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常&#xff0c;在2D平面中&#xff0c;仿射变换的应用较多&#xff0c;而在3D平面中&#xff0c;透视变换又有了自己的一席之…...

ChinaSoft 论坛巡礼|开源软件供应链论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…...

VUE 组合式API

响应式 data 选项式API_响应式 <template><h3>选项式API</h3><p>{{ message }}</p> </template> <script> export default {data(){return{message:"选项式API 绑定数据"}} } </script>组合式API_响应式 <…...

尝试使用php给pdf添加水印

在开发中增加pdf水印的功能是很常见的&#xff0c;经过实验发现这中间还是会有很多问题的。第一种模式&#xff0c;采用生成图片的方式把需要添加的内容保存成图片&#xff0c;再将图片加到pdf中间&#xff0c;这种方法略麻烦一些&#xff0c;不过可以解决中文乱码的问题&#…...

ubuntu上安装edge浏览器

1下载edge浏览器 官网下载 edge浏览器的linux版本可在上面的官网中寻找。 我选择的是Linux(.deb)。 2 安装 可在终端的edge安装包所在的路径下输入下面命令安装。 sudo dpkg -i edge安装包的名称.deb3 安装可能存在的问题 1dpkg:依赖关系问题使得edge-stable的配置工作不…...

动态切换 Spring Boot 打包配置:使用 Maven Profiles 管理 JAR 和 WAR

引言 在多环境开发中&#xff0c;我们经常需要根据部署环境来改变 Spring Boot 应用的打包方式。本文将探讨如何使用 Maven Profiles 结合依赖排除来动态地切换 JAR 和 WAR 打包配置。 1. 修改 pom.xml 以支持 WAR 包 转换 Spring Boot 应用从 JAR 到 WAR 时&#xff0c;首先…...

微信小程序使用阿里巴巴矢量图标

一&#xff0c;介绍 微信小程序使用图标有两种方式&#xff0c;一种是在线获取&#xff0c;一种是下载到本地使用&#xff0c; 第一种在线获取的有个缺点就是图标是灰色的&#xff0c;不能显示彩色图标&#xff0c;而且第一种是每次请求资源的&#xff0c;虽然很快&#xff0…...

使用JAVA pdf转word

使用spire.pdf 非常简单。 查看 https://mvnrepository.com/artifact/e-iceblue/spire.pdf 注意&#xff0c;这个包在 e-iceblue 下。 下面开始撸代码 先来pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mav…...

成都瀚网科技有限公司抖音带货的正规

成都瀚网科技有限公司&#xff0c;一家在科技领域有着深厚积累的公司&#xff0c;近年来也开始涉足电子商务领域&#xff0c;特别是在抖音等短视频平台上进行带货活动。在这个充满机遇与挑战的时代&#xff0c;该公司以其独特的商业模式和运营策略&#xff0c;正在赢得消费者的…...

windows服务器热备、负载均衡配置

安装网络负载平衡 需要加入的服务器上全部需要安装网络负载平衡管理器 图形化安装&#xff1a;使用服务器管理器安装 在服务器管理器中&#xff0c;使用“添加角色和功能”向导添加网络负载均衡功能。 完成向导后&#xff0c;将安装 NLB&#xff0c;并且不需要重启计算机。 …...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...