C语言文件操作基本方法
1、文件的分类
ANSI C 的缓冲文件系统
- 缓冲文件系统
缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。
从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。
从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。 - 非缓冲文件系统
是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区
C的“缓冲文件系统”自动地在内存中开辟一个文件缓冲区, 在对文件进行处理时, 通过文件缓冲区进行输入与输出。
流式文件
C语言将文件看作是一个一个字符(字节)序列组成的,分为ASCII码文件和二进制文件两种,将这样的文件称为流式文件。
ASCII码文件的每1个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)
二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但1个字节并不对应1个字符,不能直接输出字符形式。
文件分类
(1)根据文件的性质(内容),将文件分为程序文件和数据文件。
(2)根据文件的组织形式,可分为顺序存取文件和随机存取文件。
(3)从用户的角度看,文件可以分为普通文件和设备文件两种。
(4)根据文件的存储形式(编码方式),文件分为ASCII码文件和二进制码文件,ASCII文件也称为文本文件。
2、读文件与写文件
读文件是将磁盘文件中的数据传送到计算机内存。
写文件是从计算机内存向磁盘文件中传送数据的操作。
3、文 件 指 针
文件类型 FILE
在C系统的头文件stdio.h中定义了一个名叫FILE的结构体类型。
系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息保存在一个结构类型变量中,该结构类型由系统定义、取名为FILE。
结构类型名“FILE”必须大写
“文件指针”是缓冲文件系统中的一个重要概念。
typedef struct{ short level; /* 缓冲区饱和程度 */unsigned flage; /* 文件状态标志 */char fd; /* 文件号 */unsigned char hold; /* 无缓冲区取消字符输入 */short bsize; /* 缓冲区大小缺省值512 */unsigned char *buffer; /* 缓冲区指针*/unsigned char *curp; /* 当前活动指针 */unsigned istemp; /* 草稿文件标识 */short token; /* 作正确性检验 */} FILE ;
在缓冲文件系统中可以进行文件的打开、关闭、读、写、 定位等操作。要对文件进行相应的操作,必先定义一个指向文件的指针,这个指针称为文件指针
文件指针定义
定义文件指针的形式:
FILE *指针变量标识符;
其中FILE是由系统定义的一个结构类型, 该结构体类型中含有文件名、文件状态和文件当前位置等信息
例如,FILE *fp;
表示fp是指向FILE(文件)的指针变量,通过fp可找到它指向的文件的信息。
4、文件的打开和关闭
对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。
1.打开文件函数fopen()
FILE *fopen(“文件名”,“操作方式”);
功能:返回一个指向指定文件的指针。
函数原型:stdio.h 。
注:对文件操作的库函数,函数原型均在头文件stdio.h中
文件操作说明
(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。
用 fp 指向打开的文件后, 就可以用它来访问该文件
FILE *fp;
fp=fopen("data.99","r");
如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL (其值在头文件stdio.h中被定义为0)。为增强程序的可靠性,常用下面的方法打开一个文件:
if((fp=fopen("文件名","操作方式"))==NULL){ printf("can not open this file\n"); exit(0); }
对文件操作的方式(模式)
r ---- 以只读方式打开一个文本文件(该文件已存在)
位置指针指向文件头,从此处读数据
w ------ 以只写方式打开一个文本文件,若该文件不存
在,系统自动建立它,否则,刷新此文件,位
置指针指向文件头,从此处写数据。
a ------- 以追加方式打开一个文本文件,指针指向文件尾
r+ --------以读/写方式打开一个文本文件
打开文件时,读写位置指针指向文件头,以覆
盖方式写文件
w+ ------- 以读/写方式建立一个新的文本文件
对文件操作的方式(模式)
a+ --------以读/写方式打开一个文本文件打开文件时,读从文件头开始;写从文件尾部追加。
rb -------- 以只读方式打开一个二进制文件
wb -------- 以只写方式打开一个二进制文件
ab --------- 以追加方式打开一个二进制文件
rb+ -------- 以读/写方式打开一个二进制文件
wb+ ------- 以读/写方式打开一个新的二进制文件
ab+ -------- 以读/写方式打开一个二进制文件
有些C编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。
使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;
在输出时,将换行符转换成回车和换行两个字符。
使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。
在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针:
标准输入文件——stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据
标准输出文件——stdout:指向终端输出(一般为显示器)
标准错误文件——stderr:指向终端标准错误输出(一般为显示器)
文件关闭函数fcolse()
对一个文件操作完成后,要将该文件关闭,以避免文件的数据丢失等错误。
C语言中关闭一个文件通过系统函数fclose实现。
用法: int fclose(FILE *文件指针);
功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为0;否则,返回值为非0。
例如,fclose(fp);
关闭fp所指向的文件
示例:“w”方式打开文件(文本文件)
#include <stdio.h>
int main()
{ FILE *fp;fp=fopen("mydata1.txt","w");if (fp==NULL){ printf("file open error!\n");exit(0); } else{ printf("file open OK!\n");fclose(fp); }
}
5、文件的读写
字符读写函数fgetc和fputc
fgetc()函数从文件中读入一个字符
用法:int fgetc(文件指针);
功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移动1个字节(即指向下一个字符)。该函数无出错返回值。
在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
fputc()函数将一个字符写到文件中
int fputc(字符数据,文件指针);
其中“字符数据”,既可以是字符常量,也可以是字符变量。
功能:将字符数据输出到“文件指针”所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。
如果输出成功,则函数返回值就是输出的字符数据;否则,返回一个符号常量EOF(其值在头文件stdio.h中,被定义为-1)
字符串读写函数fgets和fputs
函数 fgets() 从文件中读一个字符串
用法:char *fgets(指针,串长度+1,文件指针);
功能:从指定文件中读入一个规定长度字符串,存入“字符数组/指针”中,并在尾端自动加一个结束标志‘\0’;同时将读写位置指针向前移动字符串长度个字节
库函数 fputs() 向指定文件输出一个字符串
用法:int fputs(字符串,文件指针);
向指定文件输出一个字符串,同时将读写位置指针向前移动strlength(字符串长度)个字节。
函数返回值: 如果输出成功函数返回值为0;否则,为非0值
数据块读写函数
fread()和fwrite()函数一般用于二进制文件的处理。
读数据块函数fread
fread(buffer,size,count,fp);
其中fp 是文件指针;buffer是一个指针,用来存放输入数据块的首地址;size 表示一个数据块的字节数;count表示要写的数据块块数。
函数功能:从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size * count个字节。
写数据块函数fwrite
fwrite(buffer,size,count,fp);
从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size*count个字节。
函数返回值:如果调用fread()或fwrite()成功,则函数返回值等于count。
位置指针复位函数 rewind
文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。 如果想改变系统这种读写规律,可使用有关文件定位的函数。
rewind函数调用形式为
rewind(文件指针);
函数的功能:使文件的位置指针返回到文件头。其中文件指针必须是有效的文件指针,即已指向文件。
格式化读写函数fscanf和fprintf
fscanf()和fprintf()函数的操作对象是指定文件,
scanf()和printf()函数的操作对象是标准输入(stdin)输出(stdout)文件。
按格式化读取函数fscanf()
int fscanf(FILE *fp, char *format, &a1,&a2,…&an)
int fscanf(文件指针, “格式符”, 输入变量首地址表);
调用形式:
fscanf( fp, format, &a1, &a2, &a3);
作用:按format给出的输入控制符,把从fp中读取的内容,分别赋给变元a1,a2,…an。
按格式化写入函数fprintf()
int fprintf(FILE *fp, char *format, a1,a2,…an);
作用: 按format给出的输出控制符,将变元a1,a2,…an的值写入到fp所指的文件中去。
随机读写与fseek()函数
对于流式文件,既可以顺序读写,也可随机读写
所谓顺序读写是指,读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。
所谓随机读写是指,读写完当前数据后,可通过调用fseek()函数,将位置指针移动到文件中任何一个地方。
用法:int fseek(文件指针,位移量,参照点);
功能:将指定文件的位置指针,从参照点开始,移动指定的字节数
相关文章:

C语言文件操作基本方法
1、文件的分类 ANSI C 的缓冲文件系统 缓冲文件系统 缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。 从磁盘文件向内…...

SQL 相关子查询 和 不相关子查询、Exists 、Not Exists、 多表连接(包含自连接)
不相关子查询 子查询的查询条件不依赖于父查询,称不相关子查询。子查询可以单独运行的 select stu_id,sex,age from student t where sex(select sexfrom studentwhere stu_id10023 )相关子查询 关联子查询 子查询的查询条件依赖于父查询,称为 相关子…...
项目规范 编写规范(范例)
项目目录 目录接口参考 项目目录结构设计,增加部分领域模型后缀强制定义,方便统一编码风格。 controller:请求处理 RestController module:按大业务区分,对多个业务对象数据聚合处理 Component manager:…...

MongoDB数据库操作及操作命令
目录 一、基础概念 二、安装mongod 三、命令交互数据库 (1)数据库命令 (2)集合命令 (3)文档命令 四、Mongoose (1)增加一条数据 (2)插入多个数据 &am…...
Linux命令(62)之tee
linux命令之tee 1.tee介绍 linux命令tee于读取标准输入的数据,并将内容输出为文件 2.tee用法 tee [参数] [filename] tee参数 参数说明-a读取标准输入的数据,并将内容追加到文件,而非覆盖-i忽略中断信号 3.实例 3.1.将ls -l输出内容作为…...

搭建Repo服务器
1 安装repo 参考:清华大学开源软件镜像站:Git Repo 镜像使用帮助 2 创建manifest仓库 2.1 创建仓库 git init --bare manifest.git2.2 创建default.xml文件 default.xml文件内容: <?xml version"1.0" encoding"UTF-8" ?…...

安卓:MMKV——键值存储库
目录 一、MMKV介绍 1.特点和优势: 2.使用指南: 3.依赖包: 二、MMKV的常用方法 1、初始化和获取实例: 2、存储数据: 3、读取数据 4、删除数据 5、其他操作: 三、MMKV的使用例子 MainActivityÿ…...

使用Python将图像转换为PDF:一次性解决您的批量转换需求
导语: 在数字化时代,我们经常需要处理大量的图像文件。将这些图像转换为PDF格式可以方便地存档、分享和打印。本文将介绍如何使用Python编程语言将图像批量转换为PDF,并提供了一个简单易用的图形界面来跟踪转换进度。 准备工作 在开始之前…...

Vue——webpack
webpack 一、Install1.全局安装2.局部安装 二、总结1.打包2.定义脚本3.配置文件定义(webpack.config.js)4.项目重新加载依赖5.webpack打包Css6.style-loader 一、Install 1.全局安装 npm install webpack webpack-cli -g2.局部安装 以项目为单位,一个项…...

springboot房地产管理java购房租房二手房j客户sp源代码mysql
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 springboot房地产管理 系统1权限:管理员 …...
Gartner 发布影响数据科学和机器学习未来方向重要趋势
出品 | CSDN 云计算 供稿 | Gartner Gartner今日发布了影响数据科学与机器学习(DSML)未来方向的重要趋势。随着DSML行业的快速发展和演变,数据对于人工智能(AI)开发与运用的重要性日益提高,尤其是投资重点…...
72. 编辑距离
题目介绍 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1: 输入:word1 "horse", word2 &q…...
Android12.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局
1.前言 在12.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…...

周末在家值班,解决几个月前遗忘的Bug
问题: 周末被迫在家值班,无聊之际打开尘封已久的Bug清单,发现有Bug拖了几个月还没解决… 场景是这样子的,有个功能是拿Redis缓存热点数据进行展示,暂且称它为功能A,有个另外的功能B,它会去更新缓…...
Shell编程基础(十五)文本三剑客(sed)
文本三剑客(sed) 使用场景基本语法实例命令列表 使用场景 sed提供了一种面交互的方式修改文件内容。 它是一行一行处理,可以通过正则匹配要修改的部分 基本语法 基本语法 sed [-opt] command files(多个文件 空格隔开) sed 使用正则 sed -…...

5,二叉树【p6-p7】
二叉树 5.1二叉树5.1.1例1:用递归和非递归两种方式实现二叉树的先序、中序、后序遍历5.1.1.1递归序的先序、中序、后序遍历先序遍历:中序遍历:后序遍历: 5.1.1.2非递归序的先序、中序、后序遍历先序遍历:中序遍历&…...

【Spring】如果你需要使用重试机制,请使用Spring官方的Spring Retry
文章目录 前言Spring Retry的基本使用第一步,引入Spring Retry的jar包第二步,构建一个RetryTemplate类第三步,使用RETRY_TEMPLATE注意事项 拓展方法降级操作重试策略:时间策略重试策略:指定异常策略 前言 Spring Retr…...
pagehelper 优化自定义分页和排序位置
pagehelper开源地址 https://github.com/pagehelper/Mybatis-PageHelper 1.手写Count查询优化 源码分页count时首先是判断是否存在手写的 {业务查询id}_COUNT 的查询count统计 private Long count(Executor executor, MappedStatement ms, Object parameter,RowBounds rowBound…...
Linux下查询文件夹中文件数量的方法
一、前言 在Linux系统中,我们经常需要查询文件夹中包含多少文件。本文将介绍三种在Linux中查询文件夹中文件数量的方法,帮助你轻松获取所需信息。 二、方法 1、使用ls命令和wc命令 使用ls命令的-l选项和管道操作符|结合wc命令来统计文件数量…...

PS透明屏,在科技展示中,有哪些优点展示?
PS透明屏是一种新型的显示技术,它将传统的显示屏幕与透明材料相结合,使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性,通…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...