文件操作(1)(C语言版)

前言:

        

        为什么要学习文件操作:

        1、如果大家写过一些代码,当运行结束的时候,这些运行结果将不复存在,除非,再次运行时这些结果才能展现在屏幕上面,就比如之前写过的通讯录。

        现实中的通讯录可以保存自己写进去的信息,下次方便查找,但是我们写的当程序推出结束后,里面的信息也随之销毁不会保存

      2、  是因为我们运行的结果都存在了内存当中,程序结束后内存中的数据将会自动清空,但是我们找到我们保存在C盘或者是其它盘中的文件数据就算电脑关机也不会被清除,原因是这些文件数据都保存在硬盘中,硬盘中的数据不会自动清空,所以一般我们删除一些文件都是手动删除。

        所以学会文件的相关操作以后,数据就可以直接保存在硬盘当中!!!

文件的分类:

        我们经常看到不同的文件,但是在程序设计的时候文件有以下两种

1、程序文件:

常以 .c \ .obj \ .exe结尾的

        

        

       

2、数据文件:

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

例如:

文本文档.txt,

文件名:

        一个完整的文件,肯定是有完整的文件名,文件名有如下几部分组成:


        文件路径+文件名主干+文件后缀

        例如: c:\code\test1.txt

文件的打开与关闭:

        我们向文件中存储数据的步骤应该是:

        1、打开文件。

        2、输入要存入的数据。

        3、关闭文件。

1、打开文件:

        当我们打开文件前vs会提供给我们一个FILE类型的结构体:

struct _iobuf {char *_ptr;int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;

        编译器会开辟一个文件信息区,这些文件的地址,名称,大小等等的一些信息会保存在这个地方,不同编译器提供的文件信息可能有所不同。

        我们通常会创建一个FILE*的指针维护文件信息,当打开文件的时候,会返回文件的相关信息的地址,文件的相关内容我们用FILE*去接收。

 fopen打开文件:

        要打开一个文件,我们通常用fopen函数打开,需要包括fopen相关的头文件

        #include<stdio.h>

        当然fopen打开文件有如下的打开方式:

具体打开代码如下:

        

#include<stdio.h>
int main()
{FILE* pf = fopen("cool.txt", "w");return 0;
}

对fopen传参的说明:

   

 第一个"  " 里面写你要打开的文件的文件名,有两种写法:
          第一种相对路径打开:如果文件名称前面什么都不加,那就表示在当前程序存放的路      径下打开
          如果加..\\表示在上一级路径下打开..\\..\\表示在上上级路径下打开
          第二种绝对路径打开写入完整的名称,也就是完整的文件路径,从根目录到该文件      的路径
            例如:D:\cold\2024_6_16_\2024_6_16_

第二个"  "里面写的是你要用哪种方式打开文件
          如果要用写("w")的形式打开,如果相路径中没有对应的文件,就会自己创建一个

当然也有可能文件打开失败,所以要判断一下,fopen函数打开失败的时候会返回NULL

指针:

所以代码改造为:

int main()
{FILE*pf = fopen("cool.txt", "w");if (pf == NULL){perror("fopen");return 1;}return 0;
}

2、关闭文件

        关闭文件我们用fclose关闭。

        传参只需要传需要关闭文件的的地址。

        代码如下:

	fclose(pf);

        但是关闭完之后,pf变量中存的文件地址是不是还存在呢?

        答案是存在的,这是pf中存的地址不再是我们开辟的了,导致FILE*pf变成了野指针,所以最后要将pf == NULL。

        代码改造如下:

	fclose(pf);pf = NULL;

完整文件打开与关闭代码:

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

运行结果:

        

文件的读写操作:

        介绍完文件如何打开与关闭后,需要我们知道如何将我们想要将内容写入文件中

我们需要知道几个函数和相应的功能

流的概念:

数据和外部设备进行相互交互的时候,都是通过流(数据流)进行交互。

并不是直接进行信息交换的!

        传输不同的数据的时候,我们需要把数据传输到不同的流当中,当然在c语言运行的时候,编译器会自动打开三个标准流,使得我们可以直接传输:

1、标准输入流:stdin

2、标准输出流:stdout

3、标准错误流:stderr

在我们使用printf在屏幕上打印一些数据的时候就要用到标准输出流

在我们使用scanf从键盘上获取数据到内存中的时候就要用到标准输入流

这里的流也可以理解为FILE*的指针!

有上述一些输入输出函数和流的基本概念,接下来我们一个一个探讨和举例。

fgetc和fputc函数

fputc字符输出函数

使用如下:

int main()
{FILE* pf = fopen("cool.txt", "w");//写入文件要用"w"if (pf == NULL){perror("fopen");return 1;}fputc('a',pf);//输出字符fclose(pf);pf = NULL;return 0;
}

两个参数:

第一个参数:传入想写的字符。

第二个参数:是写你要通过哪个流传入,也就是文件的地址

效果如下:

那如果我想要穿多个字符进去,该怎么传进去?

在使用fgetc的时候每传进去一个字符,它的光标自动就会往右移一个位置,等待下一个数据传入。

int main()
{FILE* pf = fopen("cool.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputc('a',pf);fputc('b', pf);fclose(pf);pf = NULL;return 0;
}

cool.txt文件中就不会打印出ab呢?

最终会打印ab,也就证实了每当用fgetc输出一个字符,对应的字符指针(光标)会自动往后移一个

可以用循环打印字母表:

int main()
{FILE* pf = fopen("cool.txt", "w");if (pf == NULL){perror("fopen");return 1;}char pc = 0;for (pc = 'a'; pc <= 'z'; pc++){fputc(pc, pf);}fclose(pf);pf = NULL;return 0;
}

当然此时我不想让它输出到文件中,我想让它输出到屏幕上,我们可以用标准输出流:

代码如下:

int main()
{FILE* pf = fopen("cool.txt", "w");if (pf == NULL){perror("fopen");return 1;}char pc = 0;for (pc = 'a'; pc <= 'z'; pc++){fputc(pc, stdout);//文件的地址换成标准输出流}fclose(pf);pf = NULL;return 0;
}


输出结果:

fgetc字符输入函数:

前提:

在用这个函数的时候打开文件的时候我们需要将打开方式变为只读的形式,一定要相互匹配。

此时我在txt文件中输入abcd。

可以用fgtec读取并存入变量中,代码如下:

int main()
{FILE* pf = fopen("cool.txt", "r");if (pf == NULL){perror("fopen");return 1;}int arr = fgetc(pf);printf("%c\n", arr);fclose(pf);pf = NULL;return 0;
}

fgets和fputs函数

fputs字符串输出函数:

        该函数可以将字符串输出到文件中,代码如下:

int main()
{FILE* pf = fopen("cool.txt", "w");//必须是写的形式打开文件if (pf == NULL){perror("fopen");return 1;}fputs("abcde", pf);fclose(pf);pf = NULL;return 0;
}

其函数和字符函数fputc比较相似,只不过传入的字符变成字符串。

fgets字符串输入函数:

        将字符串输入到内存中,保存在字符数组中并打印。

不一样的是,fgets参数有三个:

第一个参数是:你要讲字符串输入到什么地方,

第二个参数是:输入的字符的个数包括\0也就是你想输入3个字符,这里num必须是4,因为这4个里面有一个是\0。

第三个参数是:文件的地址。

例如:

我在文本文件中输入abcde,然后在屏幕上打印abc,我应该传入哪些参数?

代码如下:

int main()
{FILE* pf = fopen("cool.txt", "r");//这里一定要用读的形式打开if (pf == NULL){perror("fopen");return 1;}char arr[20];fgets(arr, 4, pf);printf("%s\n", arr);fclose(pf);pf = NULL;return 0;
}

fscanf和fprintf函数

fprintf格式化输出函数:

那么它和printf的区别在哪?

fprintf有两个参数,相较于printf多了第一个参数——文件地址。

fprintf函数的使用:

int main()
{FILE* pf = fopen("cool.txt", "w");//以写的方式打开if (pf == NULL){perror("fopen");return 1;}char arr[] = { "i love world" };fprintf(pf, "%s\n%d\n", arr,3);fclose(pf);pf = NULL;return 0;
}

这个格式化输出函数传入数据就十分方便了。

想穿什么类型的数据都可以,只要格式正确。

fscanf格式化输入函数:

这里的fscanf和scanf的区别是什么呢?

注意fscanf还是需要多一个参数,文件的地址,而且,fscanf当遇到第一个非空格字符开始输入,当再次遇到空格字符就会停止输入!!!

就比如:

fscanf字符光标一直往后找,找到第一个非空格字符读取,每读一个光标往后移一个,直到再次遇到空格字符停止读取。

int main()
{FILE* pf = fopen("cool.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[20];/*int n = 8;*/fscanf(pf, "%s", arr);/*fscanf(pf, "%d", &n);*/printf("%s\n", arr);fclose(pf);pf = NULL;return 0;
} 

此时运行结果:

当写成这样:

运行结果:

当然要想读取不同类型的数据,我们可以将不同类型的数据用空格字符隔开,然后多次利用fscanf读取!

例如:

int main()
{FILE* pf = fopen("cool.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[20];int n = 8;float a = 0;fscanf(pf, "%s", arr);fscanf(pf, "%d", &n);fscanf(pf, "%f", &a);printf("%s %d %f\n", arr,n,a);fclose(pf);pf = NULL;return 0;
} 

fread和fwrite函数

fwrite二进制输出函数:

注:此时文档是二进制文档,文档中存的是数据的二进制

 

有四个参数:

第一个参数:需要传入输出的变量的地址

第二个参数:需要传入每一个变量的大小。

第三个参数:数据的个数

第四个参数:文件的地址

int main()
{FILE* pf = fopen("cool.txt","wb");if (pf == NULL){perror("fopen");}char arr[] = {"abcde"};int arr1[] = {1,2,3,4,5,6};fwrite(arr1,sizeof(int),6,pf);fwrite(arr, sizeof(char), 5, pf);fclose(pf);pf = NULL;return 0;
}

fread二进制输入函数:

它需要的参数和fwrite是一样的,但是我们需要注意

fread的返回值类型是size_t类型,返回读取到的数据的个数!!

这里应该做一个判断。

int main()
{FILE* pf = fopen("cool.txt","rb");//二进制读文件if (pf == NULL){perror("fopen");}int i = 0;char arr[] = {"abcde"};int arr1[] = {1,2,3,4,5,6};fread(arr1,sizeof(int),6,pf);fread(arr, sizeof(char), 5, pf);for (i = 0; i < 6; i++){printf("%d ", arr1[i]);}printf("%s", arr);fclose(pf);pf = NULL;return 0;
}

sprintf和sscanf函数

sprintf函数:

是将格式化的数据转化成字符串。

例如:

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

sscanf函数:

是将字符串中的数据转换为格式化数据

struct S
{int n;float a;char b;
};
//int main()
//{
//	struct S s = { 10,(float)3.14,'a' };
//	char arr[100];
//	sprintf(arr,"%d %lf %c",s.n,s.a,s.b);
//	printf("%s\n", arr);
//	return 0;
//}int main()
{struct S s = { 10,(float)3.14,'a' };char arr[100];sprintf(arr,"%d %f %c",s.n,s.a,s.b);sscanf(arr, "%d %f %c", &(s.n), &(s.a), &(s.b));printf("%d\n", s.n);printf("%f\n", s.a);printf("%c\n", s.b);return 0;
}

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

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

相关文章

【数据结构初阶】--- 堆

文章目录 一、什么是堆&#xff1f;树二叉树完全二叉树堆的分类堆的实现方法 二、堆的操作堆的定义初始化插入数据&#xff08;包含向上调整详细讲解&#xff09;向上调整删除堆顶元素&#xff08;包含向下调整详细讲解&#xff09;向下调整返回堆顶元素判断堆是否为空销毁 三、…

一个开源的快速准确地将 PDF 转换为 markdown工具

大家好&#xff0c;今天给大家分享的是一个开源的快速准确地将 PDF 转换为 markdown工具。 Marker是一款功能强大的PDF转换工具&#xff0c;它能够将PDF文件快速、准确地转换为Markdown格式。这款工具特别适合处理书籍和科学论文&#xff0c;支持所有语言的转换&#xff0c;并…

2024年最佳插电式混合动力电动汽车

对电动汽车充满好奇和环保意识的司机们还没有准备好跨入纯电动汽车&#xff0c;他们可以找到一个折衷方案&#xff0c;即插电式混合动力车。 在过去的16年里&#xff0c;我一直在把握汽车行业的脉搏。试驾数百辆汽车、电动汽车、插电式混合动力车&#xff0c;跟踪汽车行业的新闻…

DAY04 HTMLCSS

文章目录 一 表单(1) 数字控件(2) 颜色控件(3) 日期控件(4) 月份控件(5) 星期控件(6) 搜索控件(7) 范围控件 二 浮动框架三 结构化标签四 CSS1 CSS概述2 CSS的编写位置1. inline style 行内样式2. inner style 内部样式3. outer style 外部样式4. 小结 3 CSS选择器1. 通用选择器…

一个示例学习C语言到汇编层面

给出以下代码 #include<stdio.h> int main() {int x 0, y 0, z 0;while (1) {x 0;y 1;do {printf("%d\n", x);z x y;x y;y z;} while (x < 255);}return 0; }我们把这个程序编写成32位程序&#xff0c;然后我们放入IDA中进行分析 .text:0080187…

Mysql开启查询日志(General Log)

1、增加配置&#xff1a; /etc/my.cnf [mysqld] general_log1 general_log_file/var/log/mysql/query.log 2、增加目录和文件&#xff0c;并且授权 可以使用以下命令修改权限&#xff1a; 创建目录&#xff1a;sudo mkdir -p /var/log/mysql 更改目录所有者&#xff1a;sudo…

【日常记录】【插件】prisma 链接MySQL数据库 简单入门

文章目录 1、新建项目&#xff0c;使用prisma链接数据库1.1、先创建一个项目1.2、初始化 npm 配置文件及下载依赖1.3、初始化TS配置文件1.4、初始化 prisma1.5、更改 prisma/schema.prisma1.6 更改.env 文件1.7 编写 prisma/schema.prisma1.8 将编写的 prisma/schema.prisma 映…

OSPF被动接口配置(华为)

#交换设备 OSPF被动接口配置 一、基本概念 OSPF被动接口&#xff0c;也称为抑制接口&#xff0c;即将路由器某一接口配置为被动接口后&#xff0c;该接口不会再接受和发送OSPF报文 二、使用场景 在路由器与终端相近或者直接相连的一侧配置被动接口 因为OSPF会定期发送报文…

ensp防火墙web密码重置(前提通过console可以登录)

客户电脑是命令行没有用户名直接输入密码就可以登录了&#xff0c;但是web端不知道admin的密码 前两天遇到运维单位的一台防火墙web网页不知道用户名密码&#xff0c;默认的登录不了&#xff0c;但是通过console可以登录命令行&#xff0c;今天就记录下如何通过命令行修改web页…

海康视觉算法平台VisionMaster 4.3.0 C# 二次开发01 加载方案并获取结果

前言 第一次使用海康视觉算法平台VisionMaster 4.3.0&#xff0c;项目中要使用这个平台进行视觉处理并获取结果。 运行效果 开发环境 C#&#xff0c; WPF&#xff0c; vs2022, 海康视觉算法平台VisionMaster 4.3.0 基本概念 上图这些.sol为后缀的是vm的方案文件。 打开方案文…

鸿蒙开发过程中出现很多.js或者.js.map怎么办

学习HarmonyOS应用开发已有几天了, 今天在打开DevEco Studio正常开发的过程中, 预览、修改、刷新, 然后就出现了大量的.js以及.js.map文件 这个虽然不影响开发&#xff0c;但是影响体验 问题原因&#xff1a; 编译/预览过程产生的缓存文件, 已反馈给鸿蒙的IDE团队 解决办法…

树莓派pico入坑笔记,快捷键键盘制作

使用usb_hid功能制作快捷键小键盘&#xff0c;定义了6个键&#xff0c;分别是 ctrlz ctrlv ctrlc ctrla ctrlw ctrln 对应引脚 board.GP4, board.GP8, board.GP13 board.GP28, board.GP20, board.GP17 需要用到的库&#xff0c;记得复制进单片机存储里面 然后是main主程…

3dmax2025能用云渲染吗?2025最新云渲染渲染100使用方法

3dmax2025还没用上云渲染&#xff1f;简单3步用上云渲染。 第一步&#xff0c;打开浏览器搜索渲染100&#xff0c;并进入下载客户端并安装 第二步&#xff0c;打开已安装的客户端进行安装&#xff0c;点击登录&#xff0c;未登录注册个账号即可&#xff08;注册账号时邀请码填…

Sermant标签路由能力在同城双活场景的应用

作者&#xff1a;聂子雄 华为云高级软件工程师 摘要&#xff1a;目前应用上云已成为趋势&#xff0c;用户也对应用在云上的高可靠方案有更高追求&#xff0c;目前同城双活场景作为应用高可靠方案中的一种常见实践方案&#xff0c;对微服务流量提出了数据中心亲和性的要求&…

浙江电信联合中兴通讯取得新突破,完成融合边缘商用验证

前不久&#xff0c;浙江电信联合中兴通讯在融合边缘方面取得新突破&#xff0c;在嘉兴完成了融合边缘的商用验证&#xff0c;并发布了商用版本。接下来&#xff0c;双方在融合边缘方面正式进入商用阶段&#xff0c;有效赋能新质生产力。    随着数字经济的快速发展&#xff0…

数据结构与算法笔记:基础篇 -字符串匹配(下):如何借助BM算法轻松理解KMP算法?

概述 上篇文章讲了 BM 算法&#xff0c;尽管他复杂&#xff0c;也不好理解&#xff0c;但确实工程中非常好用的一种高效字符串匹配算法。有统计说&#xff0c;它是最搞笑、最常用的字符串匹配算法。不过&#xff0c;在所有的字符串匹配算法里&#xff0c;要说最知名的一种的话…

【C++】认识STL

【C】认识STL STL的概念STL的版本STL的六大组件STL的三个境界STL的缺陷 STL的概念 SLT(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个保罗数据结构与算法的软件框架。 STL的版本 原…

便携式手持气象仪:低功耗设计

TH-LSZ05便携式手持气象仪是一款轻便、操作简便的气象监测工具&#xff0c;集成了风向、风速、大气压、温度、湿度五项气象要素的测量功能。这些设备通常设计为体积小、重量轻&#xff0c;以便于用户随时携带并使用。通过使用手持气象仪&#xff0c;用户可以实时获取关键的气象…

列表(list)(Python)

文章目录 一、定义二、列表常用操作 一、定义 list ["张三", "李四", "王五", "赵六"]二、列表常用操作 分类关键字/函数/方法说明增加列表.append(值)在列表末尾追加值列表.insert(索引&#xff0c; 值)在指定位置插入值&#xff…

安徽保安员精选模拟试题(含答案)

1、风险管理的三要素是()&#xff0c;风险评价和风险控制。 A、频率分析 B、风险分析 C、风险转移 D、后果估计 答案:B 2、治安保卫重要部位是指由()确定的、关系本单位生产业务全局的部位和生产环节。 A、企事业重点单位 B、地方政府 C、企事业单位保卫协会 D、公安机关 …