【C】⽂件操作

1. 为什么使⽤⽂件?

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。

2. 什么是⽂件?

磁盘上的⽂件是⽂件。
但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)

①. 程序⽂件

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。

②. 数据⽂件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
本章讨论的是数据⽂件。(数据文件一般后缀为.txt
在以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到显⽰器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。

③.⽂件名

⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\test.txt
为了⽅便起⻅,⽂件标识常被称为⽂件名

3. ⼆进制⽂件和⽂本⽂件?

根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件。(数据文件 text.txt文件为二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件
⼀个数据在内存中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽ ⼆进制形式输出,则在磁盘上只占4个字节(VS2019测试)。
测试代码:
#include <stdio.h>
int main()
{int a = 10000;
FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中fclose(pf);pf = NULL;return 0;
}

                                                VS上打开⼆进制⽂件的⽅法

4. ⽂件的打开和关闭

1.流和标准流

①. 

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作

②. 标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?

那是因为C语⾔程序在启动的时候,默认打开了3个流:
stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出流中。
stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为⽂件指针
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

2. ⽂件指针

缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名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 ;
不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。
每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关⼼细节。
⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。
下⾯我们可以创建⼀个FILE*的指针变量:
FILE* pf; // ⽂件指针变量
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件
⽐如:

一、⽂件的打开和关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件
在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:
注意:“w”会把已有的文件内容清空

实例代码:
/* fopen fclose example */
#include <stdio.h>
int main ()
{FILE * pFile;//打开⽂件pFile = fopen ("myfile.txt","w");//⽂件操作if (pFile!=NULL){fputs ("fopen example",pFile);//关闭⽂件fclose (pFile);}return 0;
}

用“w”,没有文件会重新建立一个新文件,
指定文件不存在,用"r"会有报错信息
.表示当前目录
..表示上一级路径
同时,我们也要分清楚

二、⽂件的顺序读写

顺序读写函数介绍

①. fputc(字符输出函数)

我们在文件内写入abcd

我们再试试在文件里写入26个字母(在“文件流”里写入)

也可以改成在标准流里写入

②.fgetc(字符输入函数)

“文件流”读文件

*练习:写一个代码,完成将data1.txt文件的内容,拷贝一份生成data2.txt文件//文件拷贝

//写一个代码,完成将data1.txt文件的内容,拷贝一份生成data2.txt文件
//文件拷贝//1.从data1.txt中读取数据
//2.写到data2.txt的文件中int main()
{FILE* pfread = fopen("data1.txt", "r");if (pfread == NULL){perror("fopen->data1.txt");return 1;}FILE* pfwrite = fopen("data2.txt", "w");if (pfwrite == NULL){fclose(pfread);pfread = NULL;perror("fopen->data2.txt");return 1;}//数据的读写(拷贝)int ch = 0;while ((ch = fgetc(pfread)) != EOF){fputc(ch, pfwrite);}fclose(pfread);fclose(pfwrite);return 0;
}

读取失败会返回EOF

③.fputs(文本行输出函数)

④.fgets(文本行输入函数)

未读取的时候

读取num个字符,看监控

我们读和写都用“标准流来试一试

⑤.fprintf(格式化输出函数)

我们打印到“文件流”里

⑥.fscanf(格式化输入函数)

scanf约束小数位数,vs会报错

⑦.fwrite(二进制输入)

二进制的形式“文件流”写入

对比一下fprintf和fwrite写入

⑧.fread(二进制输入)

二进制写入不耽误二进制读

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

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

相关文章

世微 AP5199S 降压恒流车灯驱动IC 兼容HV9910

说明 AP5199S 是一款外围电路简单的多功能平均电流 型 LED 恒流驱动器&#xff0c;适用于宽电压范围的非隔离式 大功率恒流 LED 驱动领域。 芯片 PWM 端口支持超小占空比的 PWM 调光&#xff0c; 可响应最小 60ns 脉宽。芯片采用我司专利算法&#xff0c;为客 户提供最佳解决方…

AIGC时代,如何保障ai绘图的算力需求

AIGC是目前非常热门的技术领域&#xff0c;被广泛应用于各个行业和领域&#xff0c;但同时AIGC也面临着诸多的痛点&#xff0c;那么如何解决这些痛点问题呢&#xff1f;云时代&#xff0c;又是如何通过云电脑赋能AIGC行业的&#xff0c;那么一起来文章中了解一下吧。 AIGC是什…

Trie 树详解

Trie 树详解 Trie 树&#xff08;字典树&#xff09;是一种用于高效存储和搜索字符串集合的树状数据结构。它的主要特点是能够在O(N)时间内实现字符串的插入、删除和搜索操作&#xff0c;其中 N 是字符串的长度。Trie 树的结构适用于敏感词过滤、单词搜索、自动补全等场景。在…

【HarmonyOS】【DevEco Studio】安装教程及环境配置问题解决

目录 一、DevEco Studio 安装二、配置环境ohmp安装报错问题解决方法一&#xff1a;注册表删除数值&#xff08;没解决&#xff09;方法二&#xff1a;进入DevEco Studio点击Settings进入设置&#xff08;没解决&#xff09;方法三&#xff1a;自己去官网下载ohmp的包安装&#…

PR片头模板|圣诞节快乐视频片头模板 Merry Christmas Logo

Merry Christmas logo 圣诞节快乐片头模板PR视频剪辑素材免费下载。 3个文本层。 9秒持续时间。 轻松的颜色控制。 After Effects and Premiere Pro 2021或更高版本。 全高清&#xff08;19201080&#xff09;. 不需要插件。 包括视频教程. 不包括音频。 快速渲染。 来自PR模板…

Corona最新渲染器Corona11详解,附送下载地址

近日&#xff0c;Corona进行了大版本更新&#xff0c;发布了最新的Corona11。这次更新&#xff0c;包含众多新功能和新修复&#xff0c;借助 Corona 11 用户可将作品提升到更高的创作水准&#xff0c;更真实可感的视觉水平。 那么更新了那些呢&#xff1f;一起来看看吧&#x…

zookeeper1==zookeeper源码阅读,源码启动ZK集群

下载源码 Tags apache/zookeeper GitHub https://codeload.github.com/apache/zookeeper/zip/refs/tags/release-3.9.1 JDK8 MAVEN3.8.6 mvn -DskipTeststrue package 配置ZK1 zkServer.cmd中指出了启动类是 QuorumPeerMain QuorumPeer翻译成集群成员比较合理&#xf…

el-table/avue-curd 相同列内容合并

1.效果 2.html 3.js spanMethod({ row, column, rowIndex }) {if (column.property deviceName) {if (rowIndex > 0 && row.deviceName this.data[rowIndex - 1].deviceName) {return {rowspan: 0,colspan: 1,};}let rowspan 1;for (let i rowIndex 1; i < …

Windows提权方法

简介 内网提权&#xff0c;本意为通过某些服务的漏洞&#xff0c;从而获取到该服务器的shell&#xff0c;进而内网渗透&#xff0c;最终从普通用户变成超级管理员的一个过程 以下是一些常见的内网提权原理和方法&#xff1a; 横向移动&#xff1a;攻击者通过在内网中的一台受感…

学校家委会的职责和作用

在教育领域&#xff0c;学校家委会是一个不可或缺的角色。那么&#xff0c;学校家委会的职责和作用是什么呢&#xff1f;作为家长&#xff0c;我们又该如何参与其中呢&#xff1f;接下来&#xff0c;我将以知乎的口吻&#xff0c;为大家解答这些问题。 先让我们了解一下学校家委…

选品大作战:通过飙升榜找到了1000个爆款

通过商品飙升榜我发现了1000多个超级爆款&#xff01;赶超空间还很大。 店铺想要有流量、有销量&#xff0c;必须要会打造爆款&#xff01;打造的前提是会找到爆款。 拼多多每段时间都会有不少产品发生变化&#xff0c;在拼多多大幅爆单的&#xff0c;销售排名上升千万的商品…

YB2416D 30V 输入,3A 输出,CCCV 控制,高效率同步降压转换器

YB2416D 30V 输入&#xff0c;3A 输出&#xff0c;CC&CV 控制&#xff0c;高效率同步降压转换器 概述: YB2416是一款输入耐压超过40V,在4.5V-30V输入电压条件下正常工作&#xff0c;并且能够实现精确恒压以及恒流的同步降压型DC-DC转换器。YB2416内部集成80m2的上管和40m2…

Linux高级管理--安装MySQL数据库系统

MySQL服务基础 MySQL.是一个真正的多线程、多用户的SQL数据库服务&#xff0c;凭借其高性能、高可靠和易于使 用的特性&#xff0c;成为服务器领域中最受欢迎的开源数据库系统。在2008年以前&#xff0c;MySOL项目由MySQL AB公司进行开发&#xff0c;发布和支持&#xff0c;之后…

多模态统计图表综述:图表分类,图表理解,图表生成,图表大一统模型

Overview 多模态统计图表综述一、图表分类1.1 Survey1.2 常见分类数据集&#xff1a;1.3 常见图表类型 二、图表理解2.1 VQA2..1.1 DVQA CVPR20182.1.2 PlotQA 20192.1.3 ChartQA 2022 2.2 Summary2.2.1 Chart-to-text ACL 2022 三、图表生成四、图表大一统模型4.1 UniChart 20…

RHEL8_Linux使用podman管理容器

本章主要介绍使用 podman 管理容器 了解什么是容器&#xff0c;容器和镜像的关系安装和配置podman拉取和删除镜像给镜像打标签导出和导入镜像创建和删除镜像 1.了解容器及和镜像的关系 对于初学者来说&#xff0c;不太容易理解什么是容器&#xff0c;这里举一个例子。想象一下…

电线电缆行业生产管理MES系统解决方案

电线电缆行业生产管理mes系统核心功能 基础数据管理&#xff1a;对基础数据进行统一管理&#xff0c;包括组织架构、原材料数据、设备数据、报工数据、检验数据、员工数据等工艺与BOM管理&#xff1a;对工艺标准进行统一管理&#xff0c;包括工艺的版本管理、关联型号管理&…

结构化并发 ForkJoinPool StructuredTaskScope

Java 通过引入结构化并发 API 简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单一工作单元&#xff0c;从而简化错误处理和取消操作、提高可靠性并增强可见性 结构化并发由 JEP 428 提出&#xff0c;并在 JDK 19 作为孵化API。它由 JEP 437 在 JDK 20 中重新孵化…

在linux服上使用nginx+tomcat部署若依前后端分离版本(RuoYi-Vue)

一、先拉工程&#xff0c;地址&#xff1a;RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 二、在window上用idea打开跑通&#xff0c;可参考…

vue 实现签字功能

1、安装&#xff1a;npm install vue-esign --save 2、main.js文件中全局引入&#xff1a; // 签字 import vueEsign from vue-esign Vue.use(vueEsign) 3、页面内容 <vue-esign ref"esign" :width"800" :height"300" :isCrop"isCro…

Leetcode—112.路径总和【简单】

2023每日刷题&#xff08;五十七&#xff09; Leetcode—112.路径总和 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …