【C语言】文件操作(详解)

在这里插入图片描述
个人主页
在这里插入图片描述

今天我们来讲一下有关文件的相关操作,希望看完这篇文章对你有所帮助,大力感谢你对博主的支持!

文章目录

  • ⭐一、为什么使用文件
  • 🎉二、什么是文件
    • 2.1 程序文件
    • 2.2 数据文件
    • 2.3 文件名
  • 🎡三、二进制文件和文本文件
  • 🚀四、文件的打开和关闭
    • 4.1 流和标准流
    • 4.2 文件指针
    • 4.3 文件的打开和关闭
  • 🏝️五、文件的顺序读写
    • 5.1 fgetc (字符输入函数)
    • 5.2 fputc (字符输出函数)
    • 5.3 fgets (文本行输入函数)
    • 5.4 fputs (文本行输出函数)
    • 5.5 fscanf (格式化输入函数)
    • 5.6 fprintf (格式化输出函数)
    • 5.7 fread (二进制输入)
    • 5.8 fwrite (二进制输出)
  • 🎄六、文件的随机读写
    • 6.1 fseek
    • 6.2 ftell
    • 6.3 rewind
  • 🚆七、文件读取结束的判定
  • 🚘八、文件缓冲区

⭐一、为什么使用文件

在日常中,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存就会被回收,数据就丢失了。我们再次运行程序时就看不到上次程序的数据。因此像要将数据进行持久化的保存,我们就需要使用文件。

🎉二、什么是文件

磁盘(硬盘)上的文件是文件。

但是在设计程序中,我们一般把文件分为两种:一是程序文件,另一个是数据文件。(从文件功能的角度进行分类)

2.1 程序文件

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

2.2 数据文件

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

2.3 文件名

文件名包含3部分:文件路径+文件名主干+文件后缀

例如:c:\code\test.txt

注意:文件标识常被称为文件名。

🎡三、二进制文件和文本文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

我们以二进制存储的方式举例:

int main()
{int a = 10000;FILE * pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中 fclose(pf);pf = NULL;return 0;
}

由于我们是以二进制的存储方式,因此打开文件的方式也要用二进制的打开方式

在这里插入图片描述
在这里插入图片描述
编译器是以小端存储且以16进制的方式进行打印

🚀四、文件的打开和关闭

4.1 流和标准流


• 由于我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,而不同的外部设备的输入和输出操作各不相同,因此为了程序员方便操作,抽象出了流的概念,我们可以把流想象成流淌着字符的河。

• C程序针对文件、画面和键盘等的数据输入和输出操作都是通过流来进行操作的。

• 一般情况下,我们要想向从流里写数据,或者从流中读取数据,都是需要打开流,然后操作。

标准流
为什么我们从键盘中输入数据,向屏幕上输出数据时,并没有打开流呢?那是因为C语言程序在启动的时候,默认打开了3个流:
stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
stdout - 标准输出流,大多数的环境中输出至显示器界面时,printf函数就是将信息输出到标准输出流中。
stderr - 标准错误流,大多数环境中输出到显示器界面。

4.2 文件指针

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

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

4.3 文件的打开和关闭

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

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

//打开⽂件 
FILE * fopen ( const char * filename, const char * mode );//关闭⽂件 int fclose ( FILE * stream );

文件的打开模式有很多种,例如:“r” 表示输入数据,打开一个已经存在的文本文件;“w” 表示输出数据,打开一个文本文件,若该文件不存在则建立一个新文件;“a” 表示向文本文件末尾添加数据等等,这里就不一一赘述了。

下面我们就以写的方式举个例子:

在这里插入图片描述

🏝️五、文件的顺序读写

5.1 fgetc (字符输入函数)

函数形式:int fgetc ( FILE * stream );

该函数成功读入数据时会返回读取字符的ASCII值,否则则会返回EOF。

例如:假如.c路径下有一文件名叫test.txt,该文件中有字符串”abcdef"

在这里插入图片描述

5.2 fputc (字符输出函数)

函数形式:int fputc ( int character, FILE * stream );

该函数返回文件指针当前指向的字符,文件指针向后移动一位
如果文件指针位于文件末尾,那么就返回EOF,并为流设置feof的文件结束显示器
如果文件读取错误,同样返回EOF,为流设置为错误显示器ferror

例如:向一个文件写入26个小写英文字符
在这里插入图片描述

5.3 fgets (文本行输入函数)

函数形式:char * fgets ( char * str, int num, FILE * stream );

从流中读取字符,并以字符串的形式存储到str中。 直到读够(num - 1)个字符,或到达换行符,或读到文件末尾时才停止

如果读取成功,则返回str的头指针,若读取失败,则为流设置错误显示器,并返回空指针。

在这里插入图片描述

5.4 fputs (文本行输出函数)

函数形式:int fputs ( const char * str, FILE * stream );

将str中的字符串输出到流中,结束符‘\0’不会被写入

在这里插入图片描述

5.5 fscanf (格式化输入函数)

函数形式:int fscanf ( FILE * stream, const char * format, ... );

以格式化的形式从流中读取数据

例如:从文件中读取字符串 “abcd”

在这里插入图片描述

5.6 fprintf (格式化输出函数)

函数形式:int fprintf ( FILE * stream, const char * format, ... );

将格式化的数据输出到指定流。

在这里插入图片描述

5.7 fread (二进制输入)

函数形式:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

二进制的形式从流中读取count个元素,每个元素的大小为size字节,并将它们存储在 ptr 指定的内存块中。

返回成功读取的元素总数。

在这里插入图片描述

5.8 fwrite (二进制输出)

函数形式:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

二进制的形式将ptr存储的数据写入流中,一共写入count个元素,每个元素的大小为size字节

返回成功写入的元素总数。

int main()
{int a = 10000;FILE * pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中 fclose(pf);pf = NULL;return 0;
}

🎄六、文件的随机读写

6.1 fseek

函数形式:int fseek ( FILE * stream, long int offset, int origin );

offset为偏移量

origin为起始位置,有三种取值:

SEEK_SET:文件头
SEEK_CUR:文件指针的当前位置
SEEK_END:文件尾

如果成功,则返回0,否则返回非零值

例如:在data.txt文件中有字符串"abcdefghi",从a的位置偏移四位就得到f
在这里插入图片描述

6.2 ftell

函数形式:long int ftell ( FILE * stream );

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

假设.c路径上的data.txt文件中存储字符串“abcdefghijk”
在这里插入图片描述

6.3 rewind

函数形式:void rewind ( FILE * stream );

让文件指针的位置回到文件起始位置

在这里插入图片描述

🚆七、文件读取结束的判定

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是遇到文件尾结束。

• 文本文件读取是否结束,判断返回值是否为 EOF

• fgetc 判断是否为 EOF

• fgets 判断返回值是否为 NULL

二进制文件的读取结束判断: 判断返回值是否小于实际要读的个数

🚘八、文件缓冲区

ANSIC标准采用“缓冲文件系统”来处理的数据文件的,所谓缓冲文件系统,是指系统能自动地在内存中为程序中每⼀个正在使用的文件开辟⼀块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。

缓冲区的大小根据C编译系统决定的。

在这里插入图片描述
今天的分享到这里就结束了,如果感到对你有所帮助,希望给博主一键三连,你的支持就是对博主最大的鼓励,我们下期再见!

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

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

相关文章

数据库中不存在该字段

mybatisplus 定义的类中某些字段是数据库里面没有的,我们可用tablefield(existfalse)来注解,演示如下:

计算机组成原理———I\O系统精讲<1>

本篇文章主要介绍输入输出系统的发展概况 一.输入输出系统的发展概况 1.早期阶段 该阶段的特点是I/O设备与主存交换信息都必须通过CPU 当时的I/O设备有如下几个特点: (1)每个I\O设备都必须配有一套独立的逻辑电路与CPU相连,用来…

Linux操作系统7- 线程同步与互斥7(RingQueue环形队列生产者消费者模型改进)

上篇文章:Linux操作系统7- 线程同步与互斥6(POSIX信号量与环形队列生产者消费者模型)-CSDN博客 本篇代码仓库:myLerningCode/l36 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 单生产单消费单保…

全面讲解python的uiautomation包

在常规的模拟鼠标和键盘操作,我们一般使用pyautogui,uiautomation模块不仅能直接支持这些操作,还能通过控件定位方式直接定位到目标控件的位置,而不需要自己去获取对应坐标位置。uiautomation模块不仅支持任意坐标位置截图&#x…

图解CNN、RNN、LSTM

一、CNN 二、RNN 三、LSTM 以上笔记参考自b站up主 自然卷小蛮(自然卷小蛮的个人空间-自然卷小蛮个人主页-哔哩哔哩视频),感兴趣的可以去深入了解。

3.25学习总结 抽象类和抽象方法+接口+内部类+API

抽象类和抽象方法: 有抽象方法,那么类肯定是抽象类。父类不一定是抽象的,但如果父类中有抽象方法那一定是抽象类。 如果子类中都存在吃这个行为,但吃的具体东西不同,那么吃这个行为定义在父类里面就是抽象方法&#x…

Ubuntu22.04 UEFI系统配置Apache Tomcat/8.5.87为开机自动启动

前置条件,Java与Tomcat目录均为/usr/local路径下。 java安装目录为:/usr/local/java tomcat安装目录为:/usr/local/tomcat 1. 创建 Tomcat 专用用户和组(可选但推荐) # 创建 tomcat 用户组 sudo groupadd tomcat#…

MySQL复习

1基本操作复习 1.1数据库创建 创建数据库create database 数据库名;判断再创建数据库create database if not exists 数据库名;创建数据库指定字符集create database 数据库名 character set 字符集;创建数据库指定排序方式create database 数据库名 collate 排序方式;创建数据…

数据结构—树(java实现)

目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…

SPI 机制与 Spring Boot AutoConfiguration 对比解析

一、架构效率革命性提升 1.1 类加载效率跃升 Spring Boot 2.7引入的AutoConfiguration.imports采用清单式配置加载,对比传统SPI机制: 传统SPI扫描路径:META-INF/services/** Spring Boot新方案:META-INF/spring/org.springfram…

node-red dashboard

安装: npm install node-red-dashboard 访问: http://127.0.0.1:1880/ui 1. 创建一个新的 Dashboard 页面: 在 Node-RED 编辑器中,拖动一个 ui_dashboard 节点到工作区,并将其连接到你的数据流。 2. 配置 Dashboard 节点: 双击…

深入理解现代C++在IT行业中的核心地位与应用实践

深入理解现代C在IT行业中的核心地位与应用实践 一、C在IT行业中的不可替代性 现代IT行业中,C凭借其零成本抽象和系统级控制能力,在以下关键领域保持不可替代地位: 应用领域C优势体现典型应用案例高性能计算直接内存管理,SIMD指令…

医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)

医院挂号预约小程序 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 (1) 用户管理 (2)医院管理 (3)医生管理 &#xf…

2025最新版Ubuntu Server版本Ubuntu 24.04.2 LTS下载与安装-详细教程,细致到每一步都有说明

官网 https://ubuntu.com/ 下载 点击菜单 Prodercts> Ubuntu OS>Ubuntu Server 点击下载 下载后会有个弹窗 安装 选择第一个 install Ubuntu Server 直接默认,选择English 【默认】 选择键盘布局【默认】 选择安装配置【默认】 配置网络 我这里选择…

【AI】NLP

不定期更新,建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…

vscode正则表达式使用

小标题 ^\d.\d.\d\s.*$ ^表示匹配字符串的开头。\d\.\d\.\d表示匹配一到多个数字,接着一个小数点,再接着一到多个数字,然后又一个小数点和一到多个数字,用来匹配类似 “2.1.1” 这样的标题号部分。\s表示匹配一个空格。.*表示匹配…

TCP/IP三次握手的过程,为什么要3次?

一:过程 第一次(SYN): 客户端发送一个带有SYN标志的TCP报文段给服务器,设置SYN1,并携带初始序列号Seqx(随机值),进入SYN_SENT状态。等待服务器相应。 第二次&#xff08…

vue-将组件内容导出为Word文档-docx

1. 安装依赖 首先,我们需要安装docx库,以便在前端生成Word文档。可以通过以下命令进行安装: npm install docx 2. 实现导出功能 2.1 初始化文档 使用docx库创建一个新的文档实例,并定义文档的结构和内容。我们使用Document、…

uni-app常用模板

列表样式一 ,下拉翻页查询,效果图及代码 <template><z-paging ref="paging" v-model="dataList" @query="queryList"><!-- 需要固定在顶部不滚动的view放在slot="top"的view中,如果需要跟着滚动,则不要设置slot=&q…

鸿蒙移动应用开发--UI组件布局

实验要求&#xff1a; 制作一个B站视频卡片界面&#xff0c;大致如下图所示&#xff0c;要求应用到线性布局、层叠布局等相关课堂知识。背景图、logo及文本内容不限。 实验环境 &#xff1a;DevEco Studio 实验过程&#xff1a; 步骤1&#xff1a;创建项目 1. 在您的开发环境…