文件操作(二)

news2025/1/24 5:35:36

 =͟͟͞͞🏀前言上一篇我们加们讲了什么是文件,为什么使用文件,以及流的概念。我们继续接上一篇来继续讲解我们的文件操作,这一篇将会详细的讲如何对文件进行读写。

目录

🚀一.文件的顺序读写

1.fgetc和fputc

2.fgets和fputs 

3. fscanf和fprintf 

4. fread和fwerite

✈️二.文件的随机读写 

1.fseek

2.ftell 

3.rewind 

🌈三.结言


🚀一.文件的顺序读写

在文件操作中我们如下几种方式进行读写:

函数名功能适用于
fgetc字符输入函数所有输入流
fputc字符输出函数所有输入流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输入流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数

所有输入流

fread二进制输入文件
fwrite二进制输出文件

这些函数分别两两一组,下面来详细的介绍一下他们吧! 

1.fgetc和fputc

int character:像文件中传入的数据。

FILE * stream:指向文件的流。

FILE * stream:指向文件的流。

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
	}
	//文件操作
	char ch = 0;
	scanf("%c", &ch);
	fputc(ch, pf);
	//关闭文件
	fclose(pf);
    pf=NULL;
	return 0;
}

fputc就是向文件中输出一个指定的字符。而fgetc就是从文件中输出一个字符。

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

这就是fputc与fgetc的作用了。

2.fgets和fputs 

const char*str:像文件中输入文本的地址。

FILE * stream:指向文件的流。

char*str:接收文本的地址。

int num:接受文本的个数。

FILE * stream:指向文件的流。

fputs的使用:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
	}
	fputs("abcdef", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

fgets的使用:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
	}
	char arr[10] = { 0 };
	fgets(arr,6,pf);
	printf("%s\n", arr);
	fclose(pf);
	pf = NULL;
	return 0;
}

3. fscanf和fprintf 

看到这一对函数我们是不是首先就想到了我们常用的scanf和printf那他们有什么区别呢?

 可以看到相比之下fprintf多了一个参数也就是我们上面提到的指向文件的流。那么使用的话只需要在前面加上这个参数即可。 

fprintf的使用:

struct stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct stu stu1 = { "zhangsan",18,90.5 };
	FILE* pf=fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fprintf(pf, "%s %d %.1f", stu1.name, stu1.age, stu1.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

我们可以看到fprintf就是将一个格式化的东西向文件中输出,那么fprintf也就是从文件向外面输出了。 

同样也是fscanf多了我们上面提到的指向文件的流。

fscanf的使用:

struct stu
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct stu s = { 0 };
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fscanf(pf, "%s %d %f", s.name, &(s.age),&(s.score));
	fprintf(stdout, "%s %d %.1f", s.name, s.age, s.score);
	return 0;
}

4. fread和fwerite

 const void * ptr:输入内容的地址。

size_t size:单个输入内容的大小。

size_t count:输入内容的数量。

 FILE * stream:指向文件的流。

 void * ptr:输出内容的地址。

size_t size:单个输出内容的大小。

size_t count:输出内容的数量。

FILE * stream:指向文件的流。

他们两个也就是对二进制进行的文件操作函数。

fwrite的使用:

struct stu
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct stu stu1 = { "zhangsan",18,90.5 };
	FILE* pf=fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fwrite(&stu1, sizeof(stu1), 1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

 我们可以看到文件出现了一些看不懂的乱码(由于字符的二进制储存与文本储存方式相同都是一ASCII码的形式),也就是说这就是以二进制存储的内容。 

fread的使用:

struct stu
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct stu s = { 0 };
	FILE* pf = fopen("test.txt", "rb");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fread(&s,sizeof(s),1,pf);
	printf("%s %d %.1f", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

✈️二.文件的随机读写 

说到随机我们可能会想到我们的rand函数,产生一个随机数。那么我们的随机读写是在任意一个地方去读写吗?其实不是的,随机读写指的是有很大的主观性,我们可以在我们想要读写的地方读写。接下来我们会认识到三个函数分别是fseek,ftell以及rewind。

1.fseek

 FILE * stream:指向文件的流。

long int offest:偏移量。

int origin:偏移的地点。(第二张图片的内容)

SEEK_SET:文件起始位置。

SEEK_CUR:光标所在的位置。

SEEK_END;文件末尾位置。

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fseek(pf,2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	return 0;
}

2.ftell 

在了解了我们的fseek函数之后我们应该怎么去找我们的光标在哪里呢?或者是说偏移量是多少?我们的ftell函数也就整好解决了这个问题。

ftell:返回⽂件指针相对于起始位置的偏移量。

这个函数就简单多了只有一个流的参数。

ftell的使用:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fseek(pf,2, SEEK_SET);
	int ch = fgetc(pf);
	int count = ftell(pf);
	printf("%c\n", ch);
	printf("count的值是%d\n", count);
	return 0;
}

3.rewind 

这个函数与ftell的参数的相同。作用是将光标回到文件的起始位置。

rewind的使用:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fseek(pf,2, SEEK_SET);
	int ch = fgetc(pf);
	int count = ftell(pf);
	printf("%c\n", ch);
	printf("count的值是%d\n", count);
	rewind(pf);
	count = ftell(pf);
	printf("rewind之后count的值是%d\n", count);
	return 0;
}

🌈三.结言

我们的文件操作大体就介绍完了,如果有喜欢的可以三连哦!!欢迎大家互相探讨,博主会经常发布一些编程语言上的知识以及题,感谢大家的支持!!  =͟͟͞͞💌=͟͟͞͞💌=͟͟͞͞💌

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

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

相关文章

Redis未授权访问漏洞复现与工具安装

目录 一、漏洞简介 二、靶场搭建 三、漏洞检测 四、工具安装 五、远程连接 六、利用Redis写入webshell 七、redis-getShell工具 八、ssh公私钥免密登录 九、其他 一、漏洞简介 redis是一个数据库,默认端口是6379,redis默认是没有密码验证的&…

16 张动图讲透网络原理

网络其实存在于日常生活中的每一个角落。 你的电脑,打印机,手机,甚至电视等等都属于网络设备。通常,你需要将这些设备通过网络连接起来,这样就可以实现数据的传输和共享,让工作生活更加便捷。 如果你的连接…

模型索引:QModelIndex

一、为什么要使用模型索引? 从名字可以看出,他是模型的索引,只要对模型实体(各种xxxModel的实体)施加这个索引,model就会返回数据集中对应的值,或者通过这个索引修改对应数据集中的值。 类比数…

【linux】软链接创建(linux的快捷方式创建)

软连接的概念 类似于windows系统中的快捷方式。有的文件目录很长或者每次使用都要找很不方便,于是可以用类似windows的快捷方式的软链接在home(初始目录类似于桌面)上创建一些软链接方便使用。 软链接的语法 ln -s 参数1 参数2 参数1&#…

GitHub图床搭建

1 准备Github账号 如果没有Github账号需要先在官网注册一个账号 2 创建仓库 在github上创建一个仓库,随便一个普通的仓库就行,选择公共仓库 3 github token获取 github token创建方式可以参考下面的方式: https://www.xichangyou.com/6…

树及二叉树

文章目录 树的概念和结构树的概念树的相关概念 二叉树的概念和结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 二叉树链式结构的实现二叉树的遍历 树的概念和结构 树的概念 树是一种非线性的数据结…

Vulnhub-DC1

前言 一个比较简单的实战靶场,官方要求是找到/root下的flag,所以直接提权即可。但对于学习和训练来说还是太简略了,在打靶场的时候还是全面一些较好。 本次靶场实战涉及信息收集、漏洞查找与利用、getshell、数据库渗透、密码破解、linux提…

京东001号快递员,刘强东给的买房承诺,仅4年时间就实现了

京东001号快递员金宜财正式退休,不知是有意还是无意,他成为了互联网的热搜,不过大众更关心的是金宜财当年得到刘强东的承诺,只要干几年就能买房,那么刘强东的承诺有没有实现,又是如何实现的呢? …

【Vue3】2-11 : 生命周期钩子函数及原理分析

本书目录:点击进入 一、组件生命周期概述 1.1 官方生命周期 1.2 钩子函数(回调函数) ▶ 生命周期可划分为三个部分(- >表示执行循序): 二、实战:测试生命周期流程 > 代码 > 效果 一…

软件测试|如何使用Python取句中中英文内容

简介 提取句子中的中英文内容在自然语言处理中是一个常见任务,通常用于文本处理、机器翻译和语言学研究。本文将详细介绍如何使用 Python 提取句子中的中英文内容,包括准备工作、选择合适的库、编写代码示例和演示示例。 准备工作 我们可以使用Python…

ruoyi后台管理系统部署-4-安装nginx

yum 安装 ngix 1.24 yum 官方源安装: # 1. 需要预先安装 yum-utils sudo yum install yum-utils # 2. 配置yum repo touch /etc/yum.repos.d/nginx.repongix.repo: [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$…

【26 预处理详解】

目录 预定义符号#define定义常量#define定义宏带有副作用的宏参数宏替换的规则宏函数的对比#和##命名约定#undef命令行定义条件编译头文件的包含其他预处理指令 1. 预定义符号 c语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理…

江科大STM32 下

目录 7、ADC数模转换器8、DMA直接存储器存取9、USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2CSPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR12.1 PWR简介12.2 …

Java21 + SpringBoot3集成WebSocket

文章目录 前言相关技术简介什么是WebSocketWebSocket的原理WebSocket与HTTP协议的关系WebSocket优点WebSocket应用场景 实现方式1. 添加maven依赖2. 添加WebSocket配置类,定义ServerEndpointExporter Bean3. 定义WebSocket Endpoint4. 前端创建WebSocket对象 总结 前…

Camunda Postman

一:下载 https://artifacts.camunda.com/ui/native/camunda-bpm/org/camunda/bpm/camunda-engine-rest-openapi/7.17.0/ 下载camunda-engine-rest-openapi-7.17.0.jar解压获取openapi.json 二:Postman导入 Postman -> File -> Import -> 上…

百度面经整理(2024最新)

百度 面经1 shiro的组件分布式一致性算法zookeeper那些能参与投票,leader能投票吗?netty零拷贝实现volatile,如何感知到变量变化的redis高可用http如何跨域?tcp如何长链接。http如何操作浏览器缓存。用过消息队列吗?…

在众多的材质中选择灰口铸铁铸造划线平台、铸铁平台等的原因——河北北重

使用灰口铸铁制作铸铁平台和划线平台的主要原因有以下几点: 强度高:灰口铸铁具有较高的强度和硬度,能够承受较大的载荷和冲击力。这使得灰口铸铁非常适合制作需要承受重压和磨损的平台和设备。 耐磨性好:灰口铸铁具有较高的耐磨性…

第六站:C++面向对象关键字解释说明

this指针: 是一个特殊的指针,放回这个对象本身,this指针是属于实例对象,不能访问静态方法(不属于某一个实例对象,属于共有的,大众的,由类直接调用) 第一种用法: void Human::setName(string name1) {this->name name1; } void Human::setAge(int age1) {this->age a…

张载为往圣继绝学,唯一的错是不够强大

“自古雄才多磨难,从来纨绔少伟男。” 张载,人称“横渠先生”。他在横渠镇,授徒讲学,恢复古礼,试验井田,写书《正蒙》。张载讲学关中,弟子多为关中人,其学派被称作关学。 张载自学…

开源知识库zyplayer-doc部署指南

1.前置条件 docker已经安装 mysql已经安装且数据库zyplayer-doc存在 服务器ip:192.168.168.99/ 数据库账户:root,密码:123456 2.拉取镜像 docker pull zyplayer/zyplayer-doc:latest 3.启动 docker run -d \--restart unless-stopped \--name zyplayer-doc \-p 8083:8083 …