【c语言】玩转文件操作

🌟🌟作者主页:ephemerals__

🌟🌟所属专栏:C语言

目录

引言

一、文件的打开和关闭

1.流

2.标准流

3.文本文件和二进制文件

4.控制文件打开与关闭的函数

二、文件的顺序读写

三、文件的随机读写

1.fseek函数

2.ftell函数

3.rewind函数

四、文件读取结束的判定

总结


引言

        我们在写程序的时候,往往会将数据存放在变量当中。如果程序退出,内存回收,这些数据就会丢失。那么我们是否有办法对这些数据进行持久化的保存,再次打开程序时数据仍然存在?答案是肯定的。而能够做到这件事的就是:文件操作

一、文件的打开和关闭

1.流

        程序的数据需要输出到外部设备,也需要从外部设备输入。对于不同设备,输入输出方式各有不同。为了方便我们在对各种输入输出设备进行操作,就有了“流”这一高度抽象的概念。在c语言中,对文件,画面,键盘等的输入输出操作都是同过“流”进行的。在一般情况下,我们想要写入数据或者读取数据,都需要打开流。

2.标准流

        c语言程序在启动的时候,默认有三个流已经为我们打开:

stdin--标准输入流,绝大多数情况下从键盘输入。

stdout--标准输出流,绝大多数情况输出至显示器上。

stderr--标准错误流,绝大多数情况输出至显示器上。

正因为这三个流已经默认打开,所以我们使用scanf、printf等函数就可以直接进行输入输出操作。

这三个流也是具有类型的,它们的类型是:文件指针(FILE*)。我们在进行文件操作的时候,通过文件指针变量就可以间接找到与它关联的文件

3.文本文件和二进制文件

        根据数据的组织形式,数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件
        如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
        ⼀个数据在文件中是怎么存储的呢?
        字符⼀律以ASCII形式存储,数值型数据既可以以ASCII形式存储,也可以使用二进制形式存储。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),而二进制形式输出,则在磁盘上只占4个字节。

4.控制文件打开与关闭的函数

        在了解了这些前置知识之后,我们切入正题--打开文件和关闭文件。c语言提供了两个函数,它们分别负责文件的打开和关闭,原型如下:

打开文件:
FILE * fopen ( const char * filename, const char * mode );
关闭文件:
int fclose ( FILE * stream );

fopen函数有两个参数,第一个参数是以字符串形式表示的文件名,第二个参数是文件的打开方式,用字符串表示。这个函数在使用的时候我们需要创建一个文件指针变量来接收,当文件打开失败时,它会返回空指针。关于打开方式,在这里一一列举:

打开方式含义如果指定的文件不存在
“r”(只读)
为了输⼊数据,打开⼀个已经存在的⽂本⽂件
返回空指针
“w”(只写)
为了输出数据,打开⼀个⽂本⽂件
建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件返回空指针
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件返回空指针
“w+”(读写)为了读和写,建立一个新的文本文件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件返回空指针
“wb+”(读写)
为了读和写,建立⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读写)
打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

对于fclose函数,它的参数是文件指针,用于关闭这个文件指针指向的文件。

接下来,我们尝试打开和关闭一个文件:

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)//文件打开失败则退出程序{perror("fopen");return 0;}printf("文件打开成功\n");fclose(pf);pf = NULL;//避免出现野指针,及时制空return 0;
}
运行结果:

可以看到,由于打开方式是“w”,该路径下确实出现了一个名为“test.txt”的文件。

二、文件的顺序读写

        接下来介绍几个函数,用于在文件当中读取或者写入数据

函数名功能适⽤于
fgetc字符输⼊函数所有输⼊流
fputc字符输出函数所有输出流
fgets⽂本⾏输⼊函数所有输⼊流
fputs⽂本⾏输出函数所有输出流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数 所有输出流
fread⼆进制输⼊⽂件输⼊流
fwrite⼆进制输出⽂件输出流

接下来我们尝试使用一下fscanffprintf函数:

这两个函数的第一个参数是一个文件指针,用于对文件数据进行读取和写入操作。之后的参数与scanf、printf函数相同。

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件if (pf == NULL){perror("fopen");return 0;}fprintf(pf, "123456");//向文件中写入数据fclose(pf);pf = NULL;return 0;
}

可以看到,数据已经写入到文件当中了。接下来我们使用fscanf函数将文件数据打印到屏幕上:

#include <stdio.h>int main()
{char str[20] = { 0 };FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件if (pf == NULL){perror("fopen");return 0;}fscanf(pf, "%s", str);//读取数据到str当中printf(str);fclose(pf);pf = NULL;return 0;
}
运行结果:

三、文件的随机读写

1.fseek函数

        fseek函数的作用是根据文件指针的位置和偏移量来定位文件指针。它的原型如下:

int fseek ( FILE * stream, long int offset, int origin );

它的第一个参数是文件指针,第二个参数是相对于设置位置的偏移量,第三个参数是设置的位置。

c语言定义了三个,可选择其中一个作为第三个参数:

SEEK_SET:文件的起始位置

SEEK_CUR:文件指针当前的位置

SEEK_END:文件的末尾

定位了文件指针之后,我们就可以在文件的指定位置处进行读取或者写入操作了。

2.ftell函数

        ftell函数用于返回文件指针相对于起始位置的偏移量。函数原型:

long int ftell ( FILE * stream );

3.rewind函数

        rewind函数用于将文件指针的位置回到文件的起始位置。它的函数原型:

void rewind ( FILE * stream );

四、文件读取结束的判定

        1.对于文本文件,我们首先可以使用fgetc函数循环读取文件中的字符,直到读到EOF为止,说明文件读取结束

        2.对于二进制文件,我们使用fread函数判断其返回值:是否小于实际要读的个数。如果小于,则说明读取结束。

        对于以上两种情况,文件读取结束时,我们可以继续判断文件读取结束的原因。介绍两个函数:feofferror

        feof函数用于判断文件读取结束的原因是否是遇到文件尾。它的原型如下:

int feof ( FILE * stream );

如果文件由于读取到文件末尾而读取结束,则返回EOF;如果是其他情况,则会返回0。

        ferror函数用于判断文件读取结束的原因是否是出现I/O错误。原型如下:

int ferror ( FILE * stream );

如果文件由于出现I/O错误而读取结束,则返回非0值;其他情况则返回0。

接下来我们尝试写一段代码对文件读取结束进行判断:

#include <stdio.h>int main()
{int c = 0;FILE* fp = fopen("test.txt", "r");if (fp == NULL){perror("fopen");return 0;}while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束{putchar(c);}//判断读取结束的原因if (ferror(fp))puts("I/O错误\n");else if (feof(fp))puts("文件读取结束\n");fclose(fp);fp = NULL;return 0;
}

总结

        今天我们学习了文件操作相关的知识,了解了文件的打开关闭,写入数据或者从文件读取数据的方法,以及调整文件指针的函数,还有对文件读取结束的判定。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

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

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

相关文章

深入理解OAuth 2.0:原理、流程与实践

一、什么是OAuth 2.0 1. 什么是OAuth 2.0 OAuth 2.0 是一套关于授权的行业标准协议。 OAuth 2.0 允许用户授权第三方应用访问他们在另一个服务提供方上的数据&#xff0c;而无需分享他们的凭据&#xff08;如用户名、密码&#xff09;。 2. OAuth 2.0 应用场景 OAuth 2.0的…

服务器U盘安装Centos 7时提示Warning:/dev/root does not exist

这是没有找到正确的镜像路径导致的&#xff0c;我们可以在命令行输入ls /dev看一下有哪些盘符 像图中红色圈起来的就是我插入U盘的盘符&#xff0c;大家的输几盘可能做了多个逻辑盘&#xff0c;这种情况下就可以先将U盘拔掉再ls /dev看一下和刚才相比少了那两个盘符&#xff0c…

权力之望怎么下载客户端 权力之望一键下载

《权力之望》是一款由NX3 Games开发、Smilegate发行的多人在线动作MMORPG游戏。这款游戏最大的特点是高度的自由度和丰富的角色定制选项。我们在游戏中不仅可以自由更换武器&#xff0c;而且游戏还提供了54种能力和60多种职业选择&#xff0c;让我们可以根据自己的游戏风格和喜…

继 承

为什么要有继承&#xff0c;继承的作用&#xff1f; 继承(inheritance)机制&#xff1a;是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加新功能&#xff0c;这样产生新的类&#xff0c;称派生类。 …

【人工智能】—基于成都市各区(市)县租房价格预测建模研究

引言 随着城市化进程的加速&#xff0c;人口流动日益频繁&#xff0c;租房市场作为城市生活的重要组成部分&#xff0c;其价格波动对居民生活质量和城市经济发展具有显著影响。成都市&#xff0c;作为中国西部地区的经济、文化、交通和科技中心&#xff0c;近年来吸引了大量人…

为什么独立站需要高质量的GPB外链?

独立站需要高质量的GPB外链&#xff0c;主要是因为它们能显著提升网站的可信度和可见性。高质量的外链相当于得到其他权威网站的认可和推荐&#xff0c;这会让搜索引擎认为你的内容有价值&#xff0c;从而提升你的搜索排名。试想一下&#xff0c;当其他有影响力的网站愿意链接到…

请求接口在控制台报cors跨域问题

我的问题是&#xff1a;BASE_URL没有和本地IP设置一致 刚开始&#xff1a;&#xff08;这个不是我本地电脑的地址&#xff09; 所以我要把&#xff1a;这个地址改为我本地电脑的ip&#xff08;http://192.168.2.50:8087&#xff09; BASE_URL: http://localhost:8087/api/ 或…

单位电脑文档怎么加密?哪种方法最有效?

单位电脑文档的加密是保障信息安全的重要措施之一&#xff0c;它可以防止未经授权的访问和数据泄露。 选择最佳的加密方法取决于您的具体需求&#xff0c;包括文档的敏感程度、加密的便捷性、成本、以及是否需要跨平台兼容性。下面是几种常见的加密方法及其优缺点&#xff0c;…

昇思学习打卡-8-FCN图像语义分割

目录 FCN介绍FCN所用的技术训练数据的可视化模型训练模型推理FCN的优点和不足优点不足 FCN介绍 FCN主要用于图像分割领域&#xff0c;是一种端到端的分割方法&#xff0c;是深度学习应用在图像语义分割的开山之作。通过进行像素级的预测直接得出与原图大小相等的label map。因…

若依微服务初始化搭建教程

文章目录 &#x1f95d;从Gitee拉取代码&#x1f344;初始化项目配置配置项目maven配置项目JDKmaven - clean - install &#x1f352;数据源配置创建config / seata数据库创建ry-cloud数据源导入ry-cloud数据 &#x1f370;启动Nacos下载Nacos修改Nacos配置双击startup.cmd启动…

GraphRAG:AI的全局文本理解革新

前言 在人工智能领域&#xff0c;处理和理解大量文本数据始终是一个挑战。随着大型语言模型&#xff08;LLMs&#xff09;的出现&#xff0c;自动化地进行复杂的语义理解和文本摘要变得可能。检索增强生成&#xff08;RAG&#xff09;方法因其能有效结合检索与生成技术&#x…

C++基础语法之重载引用和命名空间等

1.C关键字 c的关键字比我们的c语言的关键字多&#xff0c;c包容C语言并对C语言进行了补充&#xff0c;但是我们对关键字的学习是在我们后面逐渐学习的。这里我们的只是提供一个表格对齐了解一下。 2.命名空间 我们c出现了命名空间的概念&#xff0c;用关键字namespace来定义。…

论文阅读 - Intriguing properties of neural networks

Intriguing properties of neural networks 经典论文、对抗样本领域的开山之作 发布时间&#xff1a;2014 论文链接: https://arxiv.org/pdf/1312.6199.pdf 作者&#xff1a;Christian Szegedy, Wojciech Zaremba, Ilya Sutskever, Joan Bruna, Dumitru Erhan, Ian Goodfellow,…

信息技术课堂上如何有效防止学生玩游戏?

防止学生在信息技术课堂上玩游戏需要综合运用教育策略和技术手段。以下是一些有效的措施&#xff0c;可以用来阻止或减少学生在课堂上玩游戏的行为&#xff1a; 1. 明确课堂规则 在课程开始之初&#xff0c;向学生清楚地说明课堂纪律&#xff0c;强调不得在上课时间玩游戏。 制…

电阻负载柜的工作原理是什么?

电阻负载柜是用于模拟电网中各种负载特性的设备&#xff0c;广泛应用于电力系统、新能源发电、电动汽车充电站等领域。其工作原理主要包括以下几个方面&#xff1a; 1. 结构组成&#xff1a;电阻负载柜主要由变压器、调压器、电阻器、控制器、保护装置等部分组成。其中&#xf…

理解神经网络的通道数

理解神经网络的通道数 1. 神经网络的通道数2. 输出的宽度和长度3. 理解神经网络的通道数3.1 都是错误的图片惹的祸3.1.1 没错但是看不懂的图3.1.2 开玩笑的错图3.1.3 给人误解的图 3.2 我或许理解对的通道数3.2.1 动图演示 1. 神经网络的通道数 半路出嫁到算法岗&#xff0c;额…

数据防泄密软件精选|6款好用的数据防泄漏软件强推

某科技公司会议室&#xff0c;CEO张总、CIO李总、信息安全主管王经理正围绕最近发生的一起数据泄露事件展开讨论。 张总&#xff08;忧虑&#xff09;: 大家&#xff0c;这次的数据泄露事件对我们来说是个沉重的打击。客户信息的外泄不仅损害了我们的信誉&#xff0c;还可能面…

DAY2:插件学习

文章目录 插件学习ClangGoogle TestCMakeDoxygen 收获 插件学习 Clang 是什么&#xff1a;Clang 是指 LLVM 项目的编译器的前端部分&#xff0c;支持对 C 家族语言(C、C、Objective-C)的编译。Clang 的功能包括&#xff1a;词法分析、语法分析、语义分析、生成中间中间代码 L…

【源码+文档+调试讲解】智能仓储系统 JSP

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;智能仓储系统当然也不能排除在外。智能仓储系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采…

小车解决连接 Wi-Fi 后还不能上网问题

小车解决连接 Wi-Fi 后还不能上网问题 跟大家讲讲&#xff1a;为什么小车连接我们自己的热点以后还是不能联网呢&#xff1f; 小车连接我们的热点以后需要访问外面的网络&#xff0c;我们访问网络使用域名来进行的&#xff0c;所以要对域名进行解析&#xff0c;但是小车原来的域…