文件操作【上篇】

news2024/10/7 12:26:39

文章目录

  • 🗃️1.为什么使用文件
  • 🗃️2.什么是文件
    • 📁2.1.程序文件
    • 📁2.2.数据文件
    • 📁2.3.文件名
  • 🗃️3.文件的打开和关闭
    • 📁3.1.文件指针
    • 📁3.2.文件的打开和关闭
  • 🗃️4.文件的顺序读写
    • 📁4.1. fputc - 写文件
    • 📁4.2. fgetc - 读文件
    • 📁4.3. fputs - 写一行数据
    • 📁4.4. fgets - 读数据
    • 📁4.5. fprintf - 格式化的写文件
    • 📁4.6. fscanf - 格式化的读文件
    • 📁4.7. 对比一组函数:

在这里插入图片描述

🗃️1.为什么使用文件

🚩我们学习完结构体时,假如需要写一个通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加,删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。

🚩我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。

🚩使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

🗃️2.什么是文件

磁盘上的文件是文件

但是在程序设计中,我们一般谈的文件有两种:程序文件数据文件(从文件功能的角度来分类的)

📁2.1.程序文件

📍包括源程序文件(后缀为 .c),目标文件(windows环境后缀为 .obj),可执行程序(windows环境后缀为 .exe)

📁2.2.数据文件

📍文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件

📁2.3.文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用
文件名包含3部分:文件路径+文件名主干+文件后缀
例如:c:\code\test.txt
为了方便起见,文件标识常被称为文件名

🗃️3.文件的打开和关闭

😍一个经典的问题:把大象装进冰箱需要几步?
在这里插入图片描述
🥰如果想给文件存放数据或者是拿数据和把大象装进冰箱是一样的道理

🔴打开文件 — —> 操作使用(写数据/拿数据) — —> 关闭文件

在这里插入图片描述

📁3.1.文件指针

🚩缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针

🚩每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构变量中的,该结构类型是由系统声明的,取名 FILE

🚩不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异的

🚩每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节

🚩一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便

在这里插入图片描述
在这里插入图片描述

📍创建一个 FILE* 的指针变量:

FILE* pf; //文件指针变量

📁3.2.文件的打开和关闭

🚩文件在读写之前应该先打开文件,在使用结束之后应该关闭文件

🚩在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系

🚩ANSIC规定使用 fopen函数来打开文件,fclose函数来关闭文件

👇可以参考一下 cplusplus中的资料👇
在这里插入图片描述
在这里插入图片描述
文件的使用方式:
在这里插入图片描述

🗃️4.文件的顺序读写

在这里插入图片描述
🥰请看代码与注释👇

int main()
{
	//打开文件
	//相对路径
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

执行通过之后,我们看一下后台,
在这里插入图片描述
多出了 test.txt 但是大小为 0KB,因为是空的还没有写入数据

我们写入数据看一下👇:🥰请看代码与注释👇

📁4.1. fputc - 写文件

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	//把26个字母写到文件里
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		fputc('a' + i, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

执行通过之后看一下后台👇
在这里插入图片描述

我们读数据看一下👇:🥰请看代码与注释👇

📁4.2. fgetc - 读文件

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	int ch = fgetc(pf);
	printf("%c\n", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
执行通过之后,成功输出了第一个字符

那我们把26个字母都读出来👇

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	int ch = 0;
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		ch = fgetc(pf);
		printf("%c ", ch);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
可见它是一个一个读取的,这是 fgetc函数独有的功能

我们通过可以参考一下 cplusplus中的资料看一下这两个函数👇
在这里插入图片描述
在这里插入图片描述
🥰可以了解一下细节

📁4.3. fputs - 写一行数据

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写一行数据 hello world
	fputs("hello world\n", pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

📁4.4. fgets - 读数据

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读数据
	char arr[20];
	fgets(arr,5, pf);
	printf("%s\n", arr);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
🚨只打印了前4个是因为第5个放的是 \0

我们通过可以参考一下 cplusplus中的资料看一下这两个函数👇
在这里插入图片描述
在这里插入图片描述
🥰可以了解一下细节

📁4.5. fprintf - 格式化的写文件

struct S
{
	int n;
	float f;
	char arr[20];
};

int main()
{
	struct S s = { 100,3.14f,"zhangsan" };
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

📁4.6. fscanf - 格式化的读文件

int main()
{
	struct S s = { 0 };
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fscanf(pf, "%d %f %s\n", &(s.n), &(s.f), s.arr);

	printf("%d %f %s\n", s.n,s.f,s.arr);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
我们通过可以参考一下 cplusplus中的资料看一下这两个函数👇

fprintf - 格式化的写文件
在这里插入图片描述
在这里插入图片描述

fscanf - 格式化的读文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

🔴读写文件的时候:文件流

C程序默认会打开3个流:
终端设备 - 屏幕:标准输出流 stdout
键盘: 标准输入流 stdin

屏幕: 标准错误流 stderr

🔴stdout stdin stderr 都是FILE*

//比如
	int ch = fgetc(stdin);
	printf("%c\n", ch);

在这里插入图片描述

	fputc('a', stdout);
	fputc('b', stdout); 
	fputc('c', stdout);
	fputc('d', stdout);

在这里插入图片描述

	struct S s = { 1000,3.666f,"hehe" };
	fprintf(stdout,"%d %f %s\n",s.n,s.f,s.arr );

在这里插入图片描述

struct S s = { 0 };
	fscanf(stdin, "%d %f %s", &(s.n), &(s.f), s.arr);
	fprintf(stdout, "%d %f %s\n", s.n, s.f, s.arr);

在这里插入图片描述

📁4.7. 对比一组函数:

🔴scanf 针对标准输入流(stdin)的格式化的输入函数
🔴printf 针对标准输出流(stdout)的格式化的输出函数

🔴fscanf 针对所有输入流(文件流/stdin)的格式化输入函数
🔴fprintf 针对所有输出流(文件流/stdout)的格式化输出函数

🔴sscanf 把字符串转换成格式化的数据
🔴sprintf 把格式化的数据转换成字符串

struct S
{
	int n;
	float f;
	char arr[20];
};

int main()
{
	struct S s = { 200,3.5f,"wangwu" };
	//把一个结构体转换成字符串
	char arr[200] = { 0 };
	sprintf( arr,"%d %f %s\n",s.n,s.f,s.arr );
	printf("字符串的数据:%s\n", arr);

	//把一个字符串转换成对应的格式化数据
	struct S tmp = { 0 };
	sscanf(arr,"%d %f %s",&(tmp.n), &(tmp.f), tmp.arr);
	printf("格式化的数据:%d %f %s\n", tmp.n, tmp.f, tmp.arr);
	return 0;
}

在这里插入图片描述

😍今天的内容有些多有些复杂🥰希望烙铁们能够理解喔!

总结🥰
以上就是 文件操作【上篇】 的内容啦🥳🥳🥳🥳
本文章所在【C语言知识篇】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
欲知后事如何,请听下篇分解喽😘😘😘
前途很远,也很暗,但是不要怕,不怕的人面前才有路。💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

请添加图片描述

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

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

相关文章

I-型糖尿病患者的福音,皮下燃料电池将多余的血糖转化为电能产生胰岛素

I-型糖尿病患者体内不产生胰岛素&#xff0c;患者必须从外部获得激素来调节血糖水平。当前&#xff0c;患者主要通过将胰岛素泵直接连接到身体以获得胰岛素。这些胰岛素泵以及其他医疗器械&#xff08;如起搏器&#xff09;需要可靠的能源供应&#xff0c;主要通过一次性或可充…

#mvn 打包ik分词器报错#

场景&#xff1a;在window上安装ik分词器&#xff0c;需要先mvn打包&#xff0c;结果报错 原因&#xff1a;由于jdk版本的问题导致 解决过程 1&#xff1a;打包流程 git clone https://github.com/medcl/elasticsearch-analysis-ik #git clone https://gitcode.net/mirrors/me…

线性分类算法:逻辑回归和Softmax回归

目录&#xff08;一 &#xff09;逻辑回归1.1 逻辑回归概述&#xff1a;1.2 逻辑回归的作用与Sigmoid 函数&#xff1a;1.2.1 Sigmoid 函数作用1.3 指数族分布1.4 逻辑回归的损失函数1.5逻辑回归如何求解得到最优解模型方法1.6 逻辑回归鸢尾花分类1.7 逻辑回归做多分类&#xf…

拉取gradle项目报错Could not find method compile() for arguments

拉取gradle项目, 依赖拉不下来, 报错如下: Could not find method compile() for arguments XXXXXX on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler. 找了很多篇文章都没有解决,后来在stack overflow上面找到了答案: Note t…

Linux中快速搭建RabbitMQ

目录一、简介1、关于RabbitMQ2、RabbitMQ主要端口介绍二、RabbitMQ安装1、安装依赖项socat2、下载Erlang和RabbitMQ(1) Erlang和RabbitMQ版本关系要求(2) 下载操作系统支持的Erlang和RabbitMQ版本(3) 安装Erlang和RabbitMQ三、启动和关闭1、启动服务2、查看状态3、停止服务4、设…

核心业务3:借款人借款申请

核心业务3&#xff1a;借款人借款申请 1.借款人借款申请业务流程图 2.借款项数据库绑定 ---------------------借款申请流程---------------------- 3.借款申请流程 4.前端代码逻辑 5.后端代码逻辑 ---------------------借款申请流程---------------------- 核心业务3&…

用SSH登陆Centos系统时,命令行最前面显示“的提示符[root@www myapp]”是什么意思?

用SSH登陆Centos系统时&#xff0c;命令行最前面显示“的提示符[rootwww myapp]”是什么意思&#xff1f; 在SSH登录到CentOS系统时&#xff0c;提示符 [rootwww myapp] 中的 www 表示当前登录的主机名&#xff08;hostname&#xff09;&#xff0c;也就是指当前运行的CentOS系…

基于html+css的盒子展示2

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

蓝桥杯web备赛——Node.js

node.js之前只能说是略有了解&#xff0c;这次好好了解一下吧&#xff01; 东西还是比较多的。 目前来看就了解比赛会用到的http模块就可以了&#xff0c;其他的暂且不做了解 const http require("http");//1.引入http模块const app http.createServer();//2.创建…

【网络安全】--xss漏洞

xss漏洞xss漏洞介绍危害防御方法xss测试语句xss攻击语句1. 反射性xss2.存储型xss3.DOM型xssxss漏洞介绍 定义&#xff1a;XSS 攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为 XSS&#xff0c…

线段树笔记草稿

一个左节点u << 1和右节点u << 1 | 1 的证明 区间修改部分 1.批量等值修改 前提条件 是要区间修改&#xff0c;区间查询&#xff0c;且修改操作修改的值是相同的 情景 一般是要对一个数组执行k次操作&#xff0c;每次改变其中一个区间内所有元素的值&#x…

B02-国际化语言配置

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;Silence Lamb &#x1f4d6; 本章内容&#xff1a;【国际化语言配置】 Silence-Vitev 1.0.0 基于VITE前端快速开发框架 一、创建工具类 &#x1f356;常用工具类&#xff1a;src\utils\modules\common.js /*** Descriptio…

JavaScript(WebAPI)+具体案例

专栏简介: 前端从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1. WebAPI 背景知识 1.1 什么是 WebAPI 1.2 DOM 基…

2023MathorCup数模D题思路数据代码论文【全网最全分享】

文章目录赛题思路赛题详情参赛建议&#xff08;个人见解&#xff09;选择队友及任务分配问题&#xff08;重要程度&#xff1a;5星&#xff09;2023MathorCup数模D题思路数据论文代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片&#xff0c;…

GitLab集成阿里规约进行代码质量检查

1. 获取P3C-PMD (1) 下载源码 源码地址:https://github.com/alibaba/p3c (2) 打包 (3) 把打好的包(p3c-pmd-2.1.1-jar-with-dependencies.jar)拷贝到gitlab hooks脚本可以引用到的路径下,比如我这里拷贝到gitlab的安装目录下:/var/opt/gitlab/git-hooks(我的git…

Hyperledger Fabric项目搭建区块链浏览器Hyperledger-blockchain-explorer

Hyperledger Fabric项目搭建区块链浏览器 1.下载配置文件 区块链浏览器官网&#xff1a;https://github.com/hyperledger/blockchain-explorer # 根据官网来部署 # 在项目目录创建文件夹 # org1部署区块浏览器 mkdir explorer cd explorer # 下载配置文件 wget https://raw.…

软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】

还愁没有练手的项目&#xff1f;我已经给你准备好了&#xff0c;需要评论区留下你的想法吧 1、引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 XXXXX&#xff0c;XX…

【游戏开发】自从遇见了口袋方舟后,我的世界变得精彩了起来

文章目录前言口袋方舟编辑器口袋方舟训练营第一款游戏&#xff1a;四季跑酷第二款游戏&#xff1a;梦境逃脱个人感受其他说起游戏开发&#xff0c;我不允许还有人不知道口袋方舟编辑器&#xff01;前言 一直想写一篇博客来感谢口袋方舟&#xff0c;同时记录自己第一次游戏开发…

Centos7上配置python环境

Centos7上配置python环境1 安装包准备2 pycharm安装3 Anaconda安装4 pycharm配置解释器5 更改pip源1 安装包准备 pycharm下载&#xff1a;jetbrains官网 Anaconda下载&#xff1a; 清华大学开源软件镜像站 2 pycharm安装 下载好的pycharm软件包 2. 在 opt 文件夹下新建 soft…

卫星物联网的发展背景、研究现状、以及未来前景

今天这篇文章&#xff0c;我们来聊聊卫星物联网。 请大家注意&#xff0c;我说的是“物联网”&#xff0c;而不是“互联网”。 物联网&#xff0c;Internet of Things 众所周知&#xff0c;按使用对象&#xff0c;互联网可以分为“人联网”和“物联网”。我们普通消费者用户使…