文件操作2(函数的专栏)

news2024/9/19 9:36:16

1、文件的打开和关闭

1.1文件指针

        在缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”取名为FILE。

例如, VS2013编译环境提供的 stdio. h头文件中有以下的文件类型申明:
 struct _ iobuf {
 char *_ ptr;
 int _ cnt;
 char *_ base;
 int _ flag;
 int _ file;
 int _ charbuf;
 int _ bufsiz;
 char *_ tmpfname;
};
 typedef struct _ iobuf FILE;

不同的编译器的FILE类型包含的内容不完全相同,但是都大同小异。每打开一个文件系统都会自动的创建一个FILE类型的变量,并填充其中的信息,使用时不必关心细节。

一般都是通过文件指针来维护FILE这个结构的变量。

1.2文件的打开和关闭

在我们使用文件时要先打开文件,使用之后我们要关闭文件标准C规定要用fopen来打开文件,用fclose来关闭文件。

FILE*pf=fopen(const char*filename,const char*mode);
int fclose(FILE *stream);

fopen中第一个参数是文件的名字,第二个参数是打开的方式。

fclose中的参数是创建FILE指针的变量。

2、文件的打开方式和函数

2.1打开方式的介绍

文件使用方式含义如果文件不存在
“r”(只读)为了输入数据,打开已经存在的文件文本报错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)想文本的尾部添加数据建立一个新的文件
“rb”(只写)为了输出数据,打开一个二进制文件报错
"wb"(只读)为了输出数据,打开一个二进制文件建立一个新的文件

2.2函数的对比

在对文件的管理和使用之中我们常常使用以下几种函数来对文件进行管理。

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

3.函数的讲解

PS:fgetc和fputc都是使用字符对文本进行管理,fgets和fputs都是利用字符串对文本进行管理

fscanf和fprintf是对结构体里面格式标准的数据进行管理,fread和fwrite是把文件利用二进制输入进去里面的数据是二进制出现的一般是一些二进制符号

3.1 fputc和fgetc的讲解

代码解析:

                利用fputc函数往data文件里面写入26个英文字母,英文字母的本质就是ascll码值

fputc的两个参数分别是要写入的数据和写入文件的指针。

int main()
{//新建文件
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		return -1;
	}
	char ch = 0;
	for ( ch = 'a'; ch <= 'z'; ch++)
	{
		if (ch % 5 == 0)
		{
			fputc('\n',pf);
		}
		fputc(ch, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码解析:

                fgetc的参数是你要读文件的文件指针这么一个参数,读到的数据(因为是字符)所以返回的是对应的ascll码的值,但是电脑能通过这个数字使用字符的方式打印出来。

int main()
{//新建文件
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		return -1;
	}
	int ch = fgetc(pf);
	printf("%c ", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

3.2 fputs和fgets的讲解

代码解析:

                fputs函数是一个把arr里面的字符串放入到pf文件指针里面去的一个函数,先使用pf指针使用写的方式打开文件,然后使用fputs函数把数据写入到文件里面。

int main()
{//新建文件
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		return -1;
	}
	//
	char arr[] = { "sdnjn" };
	fputs(arr, pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码解析:

                fgets函数是的参数有三个分别是要到入数据的数组,要导入的数据个数和到如数据的文件,导入完数据后就可以使用printf函数打印即可。

int main()
{//新建文件
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		return -1;
	}
	//
	char arr[100] = { 0 };
	 fgets(arr, 6, pf);
	printf("%s", arr);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

3.3 fprintf和fscanf的讲解

代码解析:

                fprintf函数就是在printf函数的基础上加入了一个文件的指针,在使用上就是把结构体的数据放入了文件指针之中。

int main()
{
	struct s sl = { 2,3.14f,'e' };
	FILE* pf = fopen("data.txt", "w");
		if (pf == NULL)
		{
			perror("pf err");
			return -1;
		}
		fprintf(pf,"%d %f %c", sl.a, sl.b, sl.c);
	fclose(pf);
	pf = NULL;
	return 0;
	return 0;
}

代码解析:

                fscanf函数和scanf函数的差别是前面的文件指针,fscanf函数就是把文件里面的数据读出来放入到结构体里面去。

int main()
{
	struct s sl = { 2,3.14f,'e' };
	FILE* pf = fopen("data.txt", "r");
		if (pf == NULL)
		{
			perror("pf err");
			return -1;
		}
		fprintf(pf,"%d %f %c", sl.a, sl.b, sl.c);
		struct s sb = {0};
		fscanf(pf,"%d %f %c", &(sb.a),&(sb.b),&(sb.c) );
		printf("%d %f %c", sb.a, sb.b, sb.c);
	fclose(pf);
	pf = NULL;
	return 0;
	return 0;
}

3.4fwrite和fread函数的讲解

代码解析:

                fwrite函数有四个参数分别是写入数据的数组,数据的单位字节,数据的个数和你要写入数据的文件指针,写入的数据会变成二进制的符号,我们是看不懂的,但是电脑可以读懂利用函数fread即可。如下:

int main()
{
	FILE* pf = fopen("data.txt", "wb");
	if (pf == NULL)
	{
		perror("pf err");
		return -1;
	}
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	fwrite(arr, 4, 10, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

代码解析:

                利用函数fread把文件里面的二进制的数据给读出来了,然后使用printf函数打印即可。

int main()
{
	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL)
	{
		perror("pf err");
		return -1;
	}
	int arr[10] = { 0 };
	fread(arr, 4, 10, pf);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

3.5 sprintf和sscanf函数的讲解(补充)

代码解析:

                sprintf函数是把结构体的数据全部都放入到数组里面。

int main()
{
	struct s sl = {3,3.14f,'c'};
	char arr[100] = { 0 };
	sprintf(arr,"%d %f %c\n",sl.a,sl.b,sl.c);
	printf("%s", arr);
        return 0;
}

代码解析:

                sscanf是一个把数组的数据读出来的一个函数,前面是你要存放数据的数组。

int main()
{
	struct s sl = {3,3.14f,'c'};//定义结构体
	char arr[100] = { 0 };//存放数据
	sprintf(arr,"%d %f %c\n",sl.a,sl.b,sl.c);//把数据存放到arr数组里面
	printf("%s", arr);//打印数组
	struct s tmp = { 0 };//后面sscanf把数据存放到这个里面
	sscanf(arr,"%d %f %c", &(tmp.a), &(tmp.b), &(tmp.c));//把数据存放到arr里面
	printf("%d %f %c", tmp.a, tmp.b, tmp.c);//打印arr里面的数据
	return 0;
}

4、文件的随机读写

4.1fseek函数的介绍

                该函数有三个参数第一个是文件指针,第二个就是从当前读取的文件字符开始走,字符SEE_CUR就是指当前的这个字符的位置,另外的两个是SEEK_SET从文件字符最开始的位置开始和SEEK_END从字符最后开始。

下列代码的意思(fseek)是:

                (因为fgetc往文件后面走了一格)从文件pf中的当前位置(第二格)开始走-1的距离也就是往回走一格。 后面利用ch打印出来的值还是与上面ch打印出来的值是一样的。

int main()
{
	FILE*pf=fopen("data.txt", "r");
	 if (pf == NULL)
	 {
		 return -1;
	  }
	     int ch=fgetc(pf);
	     printf("%c \n", ch);
		 fseek(pf,-1 , SEEK_CUR);
		  ch = fgetc(pf);
		 printf("%c", ch);

		 fclose(pf);
		pf = NULL;
		return 0;
}

4.2ftell函数的讲解

返回文件指针相对于起始的偏移量

例子如下:

                文件中存放的数据是a和b最后使用ftell函数返回的值就是2也就是与起始的位置偏移了两格

int main()
{
	FILE*pf=fopen("data.txt", "r");
	 if (pf == NULL)
	 {
		 return -1;
	  }
	     int ch=fgetc(pf);
	     printf("%c \n", ch);//a
		  ch = fgetc(pf);
		 printf("%c\n", ch);//b
		 int pos = ftell(pf);
		 printf("%d", pos);

		 fclose(pf);
		pf = NULL;
		return 0;
}

4.3rewind函数讲解

rewind函数的作用就是让文件指针返回到起始的位置

例子如下:

                使用fgetc函数往后面走了两格但是使用了rewind函数后文件指针的位置就从起始开始了。

int main()
{
	FILE*pf=fopen("data.txt", "r");
	 if (pf == NULL)
	 {
		 return -1;
	  }
	     int ch=fgetc(pf);
	     printf("%c \n", ch);//a
		  ch = fgetc(pf);
		 printf("%c\n", ch);//b
		 rewind(pf);
		 ch = fgetc(pf);//a
		 printf("%c\n", ch);
		 fclose(pf);
		pf = NULL;
		return 0;
}

以上就是在我们学文件指针时使用到的函数,如果派上用场了请多多点赞加关注,如果代码存在错误还请大佬指出,谢谢大家。

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

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

相关文章

【YOLO5 项目实战】(6)YOLO5+StrongSORT 目标追踪

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO5 项目实战】&#xff08;1&#xff09;YOLO5 环境配置与检测 【YOLO5 项目实战】&#xff08;2&#xff09;使用自己的数据集训练目标检测模型 【YOLO5 项目实战】&#xff08;6&#xff09;Y…

数据库机器上停service360safe

发现有个数据库的负载较高&#xff0c;发现有360safe&#xff0c;就准备停了该服务再观察 [rootdb1 ~]# ps -ef |grep 360 root 970 1 0 15:12 ? 00:00:10 /opt/360safe/360entclient root 976 970 5 15:12 ? 00:18:42 /opt/360…

Linux之RabbitMQ集群部署

RabbitMQ 消息中间件 1、消息中间件 消息(message)&#xff1a; 指在服务之间传送的数据。可以是简单的文本消息&#xff0c;也可以是包含复杂的嵌入对象的消息 消息队列(message queue): 指用来存放消息的队列&#xff0c;一般采用先进先出的队列方式&#xff0c;即最先进入的…

关于springboot的异常处理以及源码分析(一)

一、什么是异常处理 1、文档定义 首先我们先来看springboot官方对于异常处理的定义。springboot异常处理 在文档的描述中&#xff0c;我们首先可以看到的一个介绍如下&#xff1a; By default, Spring Boot provides an /error mapping that handles all errors in a sensib…

优思学院|如何在30分钟内评审一家供应商?SQE必需知道的11点

在供应商评审中&#xff0c;特别是时间有限的情况下&#xff0c;SQE&#xff08;供应商质量工程师&#xff09;需要通过高效的观察和分析来快速评估供应商的能力。在《哈佛商业评论》中&#xff0c;R. Eugene Goodson 的一篇“Read a Plant—Fast”文章正好提供了一个极为实用的…

python实现指数平滑法进行时间序列预测

python实现指数平滑法进行时间序列预测 一、指数平滑法定义 1、指数平滑法是一种常用的时间序列预测算法,有一次、二次和三次平滑,通过加权系数来调整历史数据权重; 2、主要思想是:预测值是以前观测值的加权和,且对不同的数据给予不同的权数,新数据给予较大的权数,旧数…

基于x86 平台opencv的图像采集和seetaface6的人脸识别功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸识别功能,opencv通过读取本地图像,将采集的本地图像送给seetaface6的人脸识别模块从而实现人脸识…

FreeRTOS学习笔记(四)——延时函数,列表,软件定时器,低功耗模式,内存管理

FreeRTOS学习笔记&#xff08;四&#xff09;——延时函数&#xff0c;列表&#xff0c;软件定时器&#xff0c;低功耗模式&#xff0c;内存管理 文章目录 FreeRTOS学习笔记&#xff08;四&#xff09;——延时函数&#xff0c;列表&#xff0c;软件定时器&#xff0c;低功耗模…

尚硅谷Java面试题第四季-MySQL面试题

1.如何建立复合索引&#xff0c;一般加在哪些字段&#xff1f;建索引的理论依据或者经验 2.Innodb的行锁到底锁了什么? 结论&#xff1a; InnoDB的行锁&#xff0c;是通过锁住索引来实现的&#xff0c;如果加锁查询的时候没有使用到索引&#xff0c;会将整个聚簇索引都锁住&am…

【python报错已解决】`Traceback (most recent call last)`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 你是否在运行Python程序时遇到了Traceback (most recent call last)的错误&#xff1f;这个错误通常表明你的程序中有一个…

为什么大负载通电瞬间电压跌落,前级MOS开关如何设计

文章目录 1.1 前言1.2 简单典型电路1.3 分析优劣性1.4 优化后的开关电路1.5 具体原理分析1.6 实验验证效果1.7 适用应用场景 1.1 前言 电子产品设计电路某负载需要断电省下或异常下电复位&#xff0c;这时候会考虑在负载供电前端增加一个开关对其进行供电做控制&#xff0c;典…

超声波模块HC_SR04(hal库)

超声波模块HC_SR04 原理 1.触发信号&#xff1a;拉高至少10us的高电平 2.回响信号处理&#xff1a;计算高电平时长 3.计算距离&#xff1a;时间*速度&#xff08;声速&#xff09;/2&#xff08;注意单位问题&#xff09; 代码实现 方法1.下拉输入 配置 用于延时微秒us和…

第四届机械制造与智能控制国际学术会议(ICMMIC 2024)

目录 重要信息 大会介绍 主办单位 协办单位 大会主席 主讲嘉宾 征稿主题 会议日程 参会方式 重要信息 会议时间&#xff1a;2024年9月27-29日 大会官网&#xff1a;www.icmmic.com&#xff08;点击查看&#xff0c;大会信息&#xff0c;报名&#xff0c;投稿&#x…

【数据结构初阶】单链表接口实现超详解

文章目录 1. 顺序表问题与思考2.单链表2. 1 概念与结构2.1.1 结点2.1.2 链表的性质 3. 单链表实现3. 1 单链表初始化3. 2 单链表的打印3. 3 头插3. 4 创建新节点3. 5 尾插3. 6 头删和尾删3. 7 查找3. 8 在指定位置之后插入或删除3. 9 在指定位置前面插入或删除指定位置3. 10 销…

推荐一款好用的mac解压缩软件

文章目录 介绍软件功能安装下载使用注意事项1.打开系统设置选择隐私与安全性2.点击添加扩展3.勾选访达扩展 小结 介绍 FastZip for Mac集压缩、解压、预览、加密压缩、分卷压缩、固实压缩、右键压缩解压、多线程压缩等功能于一体&#xff0c;绝佳的设计、便捷的操作&#xff0…

设计师AI神器!AnyDesign,一张照片加简单描述就可以编辑时尚图像!

在AI时代很多行业都被颠覆了&#xff0c;建议大家在业余时间也尽量多学习一些AI工具的使用&#xff0c;提高效率的同时也去探索更多好玩的应用。 今天给大家介绍一个非常好用的图像编辑方法-AnyDesign&#xff0c;适合时尚设计师以及普通用户使用的&#xff0c;可以让你能够更…

Python编程:从入门到实践书籍介绍

对于Python入门的书籍推荐&#xff0c;以下是五本详细讲解的书籍&#xff0c;它们各自具有不同的特点和适用对象&#xff1a; 1. 《Python编程:从入门到实践》 作者&#xff1a;埃里克马瑟斯&#xff08;Eric Matthes&#xff09;《Python编程:从入门到实践》是一本经典的Pyth…

C#实现数据采集系统-数据反写(1)MQTT订阅接收消息

C#实现数据采集系统-数据反写 实现步骤 MQTT订阅&#xff0c;接收消息反写内容写入通信类&#xff0c;添加到写入队列中 链接-消息内容处理和写入通信类队列实现Modbustcp通信写入 具体实现 1.MQTT订阅&#xff0c;接收消息 Mqtt实现采集数据转发 Mqtt控制类增加订阅方法…

【微信小程序】使用 npm 包 - Vant Weapp --定制主题

小程序对 npm 的支持与限制 1. 什么是 Vant Weapp 官方文档地址 &#xff1a;https://youzan.github.io/vant-weapp 2. 安装 Vant 组件库 详细的操作步骤&#xff0c;大家可以参考 Vant 官方提供的快速上手教程&#xff1a; https://youzan.github.io/vant-weapp/#/quickst…

Texio电源维修德士直流电源维修PSW-1080M160

Texio德士电源维修类型有&#xff1a;指针式小型直流电源、数字显示直流电源、多路输出直流电源、直流电源、相控电源、低噪声开关电源、宽幅电源、高电压宽幅电源、开关电源、超薄直流电源、4象限双电源、高电压直流电源 Texio电源维修常见系列如下 PSW-系列是一款单路输出、…