编程之路,从0开始:文件操作(2)

        Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!

        今天我们来继续学习C语言的文件操作。

a84c1562898745a2848eab9ff220bec3.gif我的博客:<但凡.

我的专栏:编程之路

持续更新高质量内容,欢迎点赞、关注!

目录

1、文件的随机读写

1.1 fseek

1.2 ftell

输出结果:​编辑

1.3 rewind

2、文件读取结束的判定

测试一:文本文件读取结束

测试二:二进制文件读取结束

3、文件缓冲区


 

1、文件的随机读写

        上一篇我们介绍的各种函数都是顺序读写函数,现在我们来看几个随机读写函数。

1.1 fseek

        这个函数可以根据文件指针的位置和偏移量来定位文件指针。

5a33711d92bc4b5f895306653b663542.png        在cplusplus.com上,我们可以看到对这三个参数的介绍:

27b0db57e00a4277973fc80c8dc121de.png

        第一个参数就是文件指针,没什么好说的,毕竟通过上节课的学习我们发现这种文件操作函数基本都要输入文件指针。

        第二个参数是偏移量参数,可以为正数,也可以为负数。

        第三个参数起始位置,我们可以看到C语言为我们提供了三个起始位置(如上图),

  • 文件头 SEEK_SET 0
  • 当前位置 SEEK_CUR 1
  • 文件尾 SEEK_END 2

我们现在上手演示一下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{FILE* pf=fopen("test.txt", "wb");//打开文件int i = 0;if (pf != NULL){char c[100] = { 0 };strcpy(c, "passion");fputs("add passion", pf);fseek(pf, 4, SEEK_SET);fputs("PASSION", pf);fclose(pf);//关闭文件}return 0;
}

运行后文件内容:

0fcc8dd053ac4331a7a00f18f382db79.png

        在这串代码中,我们先把add passion输入到文本中,然后再将光标从文件起始位置向后移四位(四个字节),这时光标在p前边。我们从光标处对光标以后文字进行了更改。

1.2 ftell

        这个函数可以返回文件指针相对于起始位置的偏移量。

9cb15d4a87414d6987d6a01663c881ba.png        我们直接传如文件指针就行,他会检测光标位置并返回光标位置相较于文本最开始的偏移量。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{FILE* pf=fopen("test.txt", "r");//打开文件int i = 0;if (pf != NULL){char c[100] = { 0 };strcpy(c, "passion");fputs("add passion", pf);fseek(pf, 4, SEEK_SET);int size = ftell(pf);printf("%d", size);fclose(pf);//关闭文件}return 0;
}

输出结果:
d61cadc3994e420a9ebf0083ae16a113.png


1.3 rewind

这个函数可以让文件指针的位置回到文件的起始位置。

2ed7492905ae49afae3c475c85837bd2.png

这个就不做代码演示了哈~,很简单的。

2、文件读取结束的判定

        我们都知道,EOF是文件结束的标志,那么feof呢?

        首先我们要弄清楚一个东西:不能用feof的返回值直接来哦按段文件是否结束。feof的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束。

        1、文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)。

        2、二进制文件的读取结束判断。判断返回值是否小于实际要读的个数(fread)。


废话也不多说,我们直接举例来测试测试:

测试一:文本文件读取结束

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{FILE* pf=fopen("test.txt", "r");//打开文件int i = 0;if (pf != NULL){char c;while ((c = fgetc(pf)) != EOF){putchar(c);}if (ferror(pf)){puts("I/0 error when reading");}else if (feof(pf)){puts("End of file reached successfully");}fclose(pf);//关闭文件}return 0;
}

输出结果:

225bf5626eb2425fb02ad9b39e868c98.png        我们文件里的文本为test,他输出我们的文本后打印了End of file reached successfully,说明遇到EOF的原因是文件结束,也就是feof的返回值为真。

测试二:二进制文件读取结束

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{double a[5] = { 1,2,3,4,5 };FILE* pf=fopen("test.bin", "wb");//打开文件,以二进制形式fwrite(a, sizeof * a, 5, pf);//写入数组fclose(pf);double b[5];pf = fopen("test.bin", "rb");//只读形式打开size_t ret_code = fread(b,sizeof *b,5,pf);//读数组,并放入b数组中if (ret_code == 5)//如果fread返回值(从文件中读取的字节数)==5,说明读取完毕{puts("Array read successfully,contents: ");for (int n = 0;n < 5;n++){printf("%f", b[n]);//打印b数组}putchar('\n');}else{if (ferror(pf)){puts("I/0 error when reading");}else if (feof(pf)){puts("End of file reached successfully");}}fclose(pf);//关闭文件return 0;
}

输出结果:

d9b18180811e44bbbb9a94735be0ce5e.png    

        这里首先我要跟大家说明一点,我们上篇介绍的fread和fwrite函数他们的功能是二进制输入和输出。也就是说,他们能更改二进制文件。但是上节课我们让他们更改的是txt文件,因为数据以二进制的形式存储,你以二进制形式更改他们,在打开txt文件时,他们会自动转化成我们能够读懂的数据。

        那么在这我创建的是bin二进制文件,常用的文本编译器根本就打不开它,如果你费尽心思打开了他,你也根本读不懂他想表达的意思,因为那是给计算机读的,不是给人看的。

3、文件缓冲区

        在C语言文件操作时,其实我们读取文件内容和输入内容到文件时,并不是直接对其进行操作的,而是通过文件缓冲区操作的。

b5528a1bb6164eeb9adbb3013ca23d12.png

        那么我们为什么要有这么一个缓冲区呢?我们带入生活,如果你要搬家,是一个物品一个物品的般好还是把所有物品都装车,一次性运过去好呢?当然是一次性运过去好啊!同样,我们把像输入的字符一个一个先放入缓冲区,等到积攒到了一定的数量,再把缓冲区的字符一次性放到硬盘中,这样就能减少系统的运行压力。

        好了,今天的内容就分享到这,觉得有帮助的老铁点带你关注支持一下,我们下次再见!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477888.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis学习(三)

声明&#xff1a;该内容来源于动力节点&#xff0c;本人在学习mybatis过程中参考该内容&#xff0c;并自己做了部分笔记&#xff0c;但个人觉得本人做的笔记不如动力节点做的好&#xff0c;故使用动力节点的笔记作为后续mybatis的复习。 六、在WEB中应用MyBatis&#xff08;使…

ES6 模块化语法

目录 ES6 模块化语法 分别暴露 统一暴露 ​编辑 默认暴露 ES6 模块化引入方式 ES6 模块化语法 模块功能主要由两个命令构成&#xff1a;export 和 import。 ⚫ export 命令用于规定模块的对外接口&#xff08;哪些数据需要暴露&#xff0c;就在数据前面加上关键字即可…

【Spring boot】微服务项目的搭建整合swagger的fastdfs和demo的编写

文章目录 1. 微服务项目搭建2. 整合 Swagger 信息3. 部署 fastdfsFastDFS安装环境安装开始图片测试FastDFS和nginx整合在Storage上安装nginxnginx安装不成功排查:4. springboot 整合 fastdfs 的demodemo编写1. 微服务项目搭建 版本总结: spring boot: 2.6.13springfox-boot…

无线电磁波在自由空间的衰减

自由空间损耗&#xff0c;指的是电磁波在空气中传播时候的能量损耗&#xff0c;电磁波在穿透任何介质的时候都会有损耗。在传输路径上的损耗&#xff0c;即为路径损耗。 自由空间路径损耗&#xff08;Free Space Path Loss&#xff09;的基本公式&#xff1a; 简化的自由空间损…

UE5实现可销毁对象的淡化销毁

进入对象材质 设置 的不透明蒙版 不透明蒙版见 UE材质不透明蒙版选项-CSDN博客 默认混合模式(不透明)下无法进行设置&#xff0c;将混合模式修改为 混合模式见 UE5材质混合模式-CSDN博客 新添加Texture sample节点 关于Texture sample&#xff1a;UE5材质Texture Sample …

【Linux学习】【Ubuntu入门】1-7 ubuntu下磁盘管理

1.准备一个U盘或者SD卡&#xff08;插上读卡器&#xff09;&#xff0c;将U盘插入主机电脑&#xff0c;右键点击属性&#xff0c;查看U盘的文件系统确保是FAT32格式 2.右键单击ubuntu右下角图标&#xff0c;将U盘与虚拟机连接 参考链接 3. Ubuntu磁盘文件&#xff1a;/dev/s…

文件的处理(c语言)

首先了解下文件的作用 文件可以把数据直接放在电脑的硬盘上&#xff0c;实现了数据的持久化 什么是文件 文件就是磁盘上的文件。在程序设计中&#xff0c;文件通常有俩种&#xff0c;一种是程序文件&#xff0c;另一种是数据文件&#xff08;这是从文件功能来分类的&#xff…

shell编程之awk

awk 是 Linux 以及 UNIX 环境中现有的功能最强大的数据处理工具。简单地讲&#xff0c; awk 是一种处理文本数据的编程语言。awk 的设计使得它非常适合于处理由行和列组成的文本数据。而在 Linux 或者 UNIX 环境中&#xff0c;这种类型的数据是非常普遍的。 除此之外&#xff…

数据库-基础理论

文章目录 前言一、ORM框架二、ACID原则三、事务Transaction四、N1问题五、Normalization三范式六、FMEA方法论&#xff08;Failure Mode and Effects Analysis&#xff09;七、Profiling和PerformanceSchema查询分析 前言 基础理论 ORM框架、ACID原则、事务Transaction、N1问…

用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)

反向传播&#xff08;Backpropagation&#xff09; 引言1. 分类交叉熵损失导数&#xff08;Categorical Cross-Entropy loss derivative&#xff09;2. 分类交叉熵损失导数 - 代码实现3. Softmax激活函数导数&#xff08;Softmax activation derivative&#xff09;4. Softmax激…

Transformer详解及衍生模型GPT|T5|LLaMa

简介 Transformer 是一种革命性的神经网络架构&#xff0c;首次出现在2017年的论文《Attention Is All You Need》中&#xff0c;由Google的研究团队提出。与传统的RNN和LSTM模型不同&#xff0c;Transformer完全依赖于自注意力&#xff08;Self-Attention&#xff09;机制来捕…

C0034.在Ubuntu中安装的Qt路径

Qt安装路径查询 在终端输入qmake -v如上中/usr/lib/x86_64-linux-gnu就是Qt的安装目录&#xff1b;

Swift 实现查找链表入环点:快慢指针法

文章目录 前言摘要描述题解答案题解代码题解代码分析示例测试及结果时间复杂度空间复杂度总结 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 142. 环形链表 II 不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无…

stable-diffusion-webui在conda pycharm中运行

目录 简介下载conda环境配置环境变量修改launch_utils.py文件运行stable-diffusion-webui下载模型文本生成图片参考 简介 stable-diffusion-webui是AI绘画 Stable Diffusion浏览器UI界面&#xff0c;为用户提供了一个简单、直观的方式来利用 Stable Diffusion 技术创建视觉内容…

小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(7)嵌入式Soc

越努力&#xff0c;越幸运&#xff01; 分享一个晚霞&#xff0c;真的好美啊&#x1f496;&#xff01; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 不得不说&#xff0c;我还是喜欢在人少的地方生活啊。 flechazohttps://www.zhihu.com/people/ji…

【云计算网络安全】解析 Amazon 安全服务:构建纵深防御设计最佳实践

文章目录 一、前言二、什么是“纵深安全防御”&#xff1f;三、为什么有必要采用纵深安全防御策略&#xff1f;四、以亚马逊云科技为案例了解纵深安全防御策略设计4.1 原始设计缺少安全策略4.2 外界围栏构建安全边界4.3 访问层安全设计4.4 实例层安全设计4.5 数据层安全设计4.6…

产业用机器人中的旋转花键若损伤有何影响?

旋转花键在产业用机器人中是关键的组件之一&#xff0c;如果机器人中的旋转花键损坏&#xff0c;会对机器人的运行和性能产生一定影响。以下是可能的影响&#xff1a; 1、功能受限&#xff1a;旋转花键用于连接两个旋转部件&#xff08;例如电机轴和传动轴&#xff09;&#xf…

基于STM32的火灾报警装置的Proteus仿真

文章目录 一、火灾报警1.题目要求2.思路2.1 主控2.2 传感器2.3 设定阈值--按键2.4 报警和通风2.5 OLED显示2.6 电源部分2.7 远程终端 3.仿真3.1 未仿真时3.2 仿真开始&#xff0c;界面13.3 切换界面23.4 切换界面3 4.仿真程序4.1 程序说明4.2 主函数4.3 OLED显示函数 二、总结 …

人脸检测开源项目介绍【持续更新】

DeepFace 介绍&#xff1a;DeepFace是一个轻量级的人脸识别和面部属性分析框架&#xff0c;专为Python设计。它集成了多种前沿的深度学习模型&#xff0c;包括VGG-Face、FaceNet、OpenFace、DeepFace、DeepID、ArcFace、Dlib、SFace和GhostFaceNet等&#xff0c;能够进行年龄、…

RabbitMQ 之 死信队列

一、死信的概念 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理 解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到 queue 里了&#xff0c;consumer 从 queue 取出消息进行…