C语言文件操作-从知识到实践全程

news2024/12/23 9:45:27

目录

引入        

文件的打开和关闭

文件如何使用程序来打开?

 绝对路径需要转义字符

fopen函数

 fclose函数

文件的打开方式(fopen第二参数const char* mode):

文件的顺序读写

fgetc和fputc的使用

 fputc

 fgetc

 fgets和fputs的使用

fputs

fgets

perror的使用

fprintf和printf

 fscanf和scanf

博主对于输入流和输出流,以及流的理解图

fread二进制的方式读和fwrite二进制的方式写

fwrite二进制的方式写

 fread二进制的方式读

 函数参数解析

scanf/fscanf/sscanf的区别、printf/fprintf/sprintf的区别

sprintf使用

 sscanf使用

 序列化和反序列化

文件的随机读写

fseek 文件光标的设置

 ftell 计算光标跟起始位置的偏移量

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

尾声


引入        

        在写编程时,例如在终端写入的数据是存放在内存中的,当程序退出后,数据就不存在了。

使用文件可以将数据存到磁盘中,能够做到数据的持久化,这就是为什么要使用文件。

        文件分为程序文件和数据文件,程序文件包含例如.c源文件、.obj编译后的目标文件、.exe链接后的可执行文件。数据文件的内容不一定是程序,而是程序运行时需要读写的数据,例如程序通过读数据文件的内容然后赋值到程序中的某个变量。

        文件名包含三个部分:文件路径+文件主干名+文件类型,例如c:\code\test.txt,因为test.txt在不同的路径下可能存在相同的名称,可以写相对路径存在的文件名,也可以写绝对路径存在的文件名。

        博主认为学习文件操作,利用程序的高效,操作文件内容进行搜索,重复部分修改,循环删除循环添加内容等,操作文件的知识学习后实践下来对我们处理文件更加的迅速高效。

文件的打开和关闭

        文件的信息区是一个结构体

        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类型包含的内容不完全相同,但是大同小异

文件如何使用程序来打开?

        每当打开一个文件就会在内存中开辟一块相应的文件信息区(一个结构体),利用C语言提供的库函数fopen和fclose进行打开一个文件和关闭一个文件。

        fopen会返回打开文件开辟的信息区的地址,这个地址类型就是FILE,即返回类型是FILE*,通过这个指针来维护文件。

        当然fopen也会失效,例如写一个文件,如果文件不存在,相当于Windows下的新建文件,例如读一个文件,如果文件不存在,当然就会返回NULL指针,所以fopen打开一个文件,FILE*变量接收的返回值要判断是否为空。

        

 绝对路径需要转义字符

----------->>>>>>>>

 -------------------------------------------------------------------------------------------------------------------

fopen函数

 

 fopen函数参考

-------------------------------------------------------------------------------------------------------------------

 fclose函数

 

 fcolse函数参考

-------------------------------------------------------------------------------------------------------------------

文件的打开方式(fopen第二参数const char* mode):

文件使用方式含义如果指定文件不存在
"r"(只读)为了输入数据,打开一个已经存在的文本文件出错
"w"(只写)为了输出数据,打开一个文本文件建立一个新文件
"a"(追加)像文本文件尾添加数据建立一个新文件
"rb"(只读)为了输入数据打开一个二进制文件出错
"wb"(只写)为了输出数据打开一个二进制文件建立一个新文件
"ab"(追加)向一个二进制文件尾添加数据出错
"r+"(读写)为了读和写打开一个文本文件出错
"w+"(读写)为了读和写建立一个新的文件建立一个新的文件
"a+"(读写)打开一个文件,在文件尾进行读写建立一个新的文件
"rb+"(读写)为了读和写打开一个二进制文件出错
"wb+"(读写)为了读和写新建一个新的二进制文件建立一个新的文件
"ab+"(读写)打开一个二进制文件,在文件尾进行读和写

建立一个新的文件

文件的顺序读写

        为什么叫做顺序读写?因为光标的移动是按顺序向后走的,例如读一个数据第一次调用库函数读的是第一个字符,第二次调用读的是第二个字符,以此类推。

          功能                                                                函数名                                适用于

fgetc和fputc的使用

 

-------------------------------------------------------------------------------------------------------------------

 fputc

 

fputc函数参考

 -------------------------------------------------------------------------------------------------------------------

 fgetc

 

fgetc函数参考

-------------------------------------------------------------------------------------------------------------------

 fgets和fputs的使用

fputs

 

fputs函数参考

 覆盖因为w,追加使用a

 可以通过fputs()的字符串后添加\n进行换行

-------------------------------------------------------------------------------------------------------------------

fgets

 

 fgets函数参考

 可以看出读4个字符但是显示3个字符,其实最后一个字符空间是留给'\0'的。

-------------------------------------------------------------------------------------------------------------------

perror的使用

更简洁方便

 

 perror函数参考

 区别在于第一种可以拿到字符串信息不打印,第二种会打印

-------------------------------------------------------------------------------------------------------------------

fprintf和printf

 

fprintf函数参考fprintf函数参考 

 

-------------------------------------------------------------------------------------------------------------------

 fscanf和scanf

 

 



fscanf函数参考

 返回值不用可以不写,提示而已,scanf也一样。

-------------------------------------------------------------------------------------------------------------------

博主对于输入流和输出流,以及流的理解图

 从内存中写数据到硬盘上并不是直接写到的,中间会有一个流来助力

 因为不同的外部设备它们的读和写不同,C语言的流底层已经实现好了,我们代码玩家不需要去深入了解。

从上面学的FILE*可以传给文件操作函数,其实FILE*就是文件流,我们不是直接的去操作外部设备,是因为有流的介入,例如FILE是一个结构体类型名,可以通过FILE*来维护文件

C程序只要运行起来默认会打开3个流,stdin(标准输入流-键盘)、stdout(标准输出流-屏幕)、stderror(标准错误流-屏幕),三个类型都是FILE*,即文件流,所以使用printf时因为默认打开的stdout标准输出流会将内容打印在屏幕上。

stdout流的使用展示

 -------------------------------------------------------------------------------------------------------------------

fread二进制的方式读和fwrite二进制的方式写

        fwrite比如将结构体内存的内容写入到文件中,文件内容以二进制的方式显示,这与字符方式显示不同,fread读取二进制的内容并将其解释成字符内容。

 

 fwrite函数参考

 

 fread函数参考

可以看到函数参数是相同的,看看具体实践。

fwrite二进制的方式写

 fread二进制的方式读

 函数参数解析

        函数参数相同,但是函数关系不同,fwrite是ptr的内容输出到流中,fread是流的内容输入到内存中,字节是size,个数是count。

----------------------------------------------------------------------------------------------------------------------------

scanf/fscanf/sscanf的区别、printf/fprintf/sprintf的区别

 ''sscanf和sprintf博主认为很牛b''

博主的记忆方式是sscanf(sprintf)和fscanf(fprintf)相似,fscanf是读文件的内容输入到指定的内存中,sscanf是读字符串的数据输入到指定的内存中,fprintf是将指定内存的内容输出到文件中,sprintf是将指定内存的内容输出到字符串中,sscanf和sprintf是格式化的转换,这个就可以将不同类型的数据按照自身的想法将格式化的数据转换到指定的字符串中!

sprintf使用

sprintf函数参考 

 sscanf使用

 sscanf函数参考

 序列化和反序列化

从前端获取一个人的个人信息,比如姓名、年龄和分数,获取的是字符串,将字符串交给后端处理,分类赋值给结构体成员。

 序列化:把对象转化为可传输的字节序列过程称为序列化。 反序列化:把字节序列还原为对象的过程称为反序列化。

文件的随机读写

        文件指针光标的位置,比如光标在文件内容的最左侧,就是文件第一个字符进行读和写。

fseek 文件光标的设置

根据文件指针的位置和偏移量来定位文件指针

 

 offset是偏移量,就是光标的移动次数。origin是已经define定义的标识符常量,分为三个。

SEEK_SET 是文件的起始位置

SEEK_CUR 是文件的当前位置

SEEK_END 是文件的结束位置

 向后偏移两次,光标就到了b和c之间,访问的是c

偏移量也可以为负值

 ftell 计算光标跟起始位置的偏移量

 ftell函数参考

 getc获取后光标到达结束位置,ftell计算偏移量

当前光标

起始光标

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

 

rewind函数参考 

 ------------------------------------------------------------------------------------------------------------

尾声

以上就是什么是文件,为什么使用文件,文件的打开和关闭,文件的顺序读写,文件的随机读写涵盖的知识,欢迎大家在评论区留言讨论、补充,让知识更加细化,让内容广为流传,好好学习,天天向上!

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

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

相关文章

哪些程序员适合自由工作?(附平台推荐)

在早些时候进行远程办公,接私活或者跨国进行编程,赚点外快等也不是什么奇怪的事情。但是那时候没有人想到会把这些工作完全变成自己的主要业务——也就是我们说的自由工作。也不知道是哪一个第1个吃了螃蟹的人发现自由工作还不错,于是经过后面…

【JavaScript】DOM 学习总结-基础知识

获取元素方法: // 获取三个非常规的标签 console.log(document.documentElement) console.log(document.head) console.log(document.body)通过id/class获取:getElementById / getElementsByClassName // 获取常规的用id,class,tag var boxdocument.g…

Android 自定义Activity的主题

一. 前言 当在某个app中做一个新界面时, 我们要考虑一下主题风格相符合一致. 本篇文章讲解的是,如何新创建的Activity 与整个app主题符合, 特别是状态栏的颜色需要和这个app的状态栏颜色保持一致. 在读本篇文章之前, 可以移步一下笔者之前写的文章:Android style&#xf…

代码随想录算法训练营第十一天字符串 java :20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

文章目录Leetcode 20. 有效的括号题目详解数据结构 双端队列(deque)Deque有三种用途:思路报错Ac代码Leetcode1047. 删除字符串中的所有相邻重复项题目详解数据结构 ArrayDeque类思路AC代码150. 逆波兰表达式求值题目详解报错难点AC代码收获Leetcode 20. 有效的括号 …

系分 - 系统设计

个人总结,仅供参考,欢迎加好友一起讨论 文章目录系分 - 系统设计考点摘要系统设计软件设计软件架构设计结构化设计概要设计详细设计处理流程设计流程工作流活动及其所有者工作项工作流管理系统WFMS的基本功能WFMS的组成WRM流程设计工具用户界面设计/人机…

python算法与数据结构1-算法、数据结构、链表

目录1、算法的概念1.1 举例:1.2 算法的五大特性:1.3 时间复杂度1.4 空间复杂度2、数据结构2.1 内存的存储结构2.2 数据结构的分类2.3 顺序表存储方式3、链表3.1链表实现3.2链表的方法3.3链表增加节点3.4链表删除节点3.5链表总结1、算法的概念 算法与数据…

(Java高级教程)第三章Java网络编程-第三节:UDP数据报套接字(DatagramSocket)编程

文章目录一:Java数据报套接字通信模型二:相关API详解(1)DatagramSocket(2)DatagramPacket三:UDP通信示例一:客户端发送什么服务端就返回什么(1)代码&#xff…

k8s之ConfigMap和secret

写在前面 我们知道k8s的数据都是存储到kv数据库etcd中的,那么我们程序中使用到各种配置信息是否可以也存储到etcd,然后在pod中使用呢?是可以的,k8s为了实现将自定义的数据存储到etcd,定义了ConfigMap 和secret两种API…

《后端技术面试 38 讲》学习笔记 Day 01

《后端技术面试 38 讲》学习笔记 Day 01 学习目标 在2022年春节将至(半个月),适合在这个冬天里,温故知新。通过学习一门覆盖面较广的课程,来夯实基础,完善自己的知识体系,是一个很棒的选择。 …

LCHub:未来,低代码产品矩阵是500强企业的绝佳选择

近日,国内知名咨询机LCHub发布2022《中国大型企业数字化升级路径研究》。 报告认为由于大型企业的数字化需求旺盛、购买力充足,因此国内成熟的数字化服务商普遍以大型企业为核心客户。大型企业与数字化服务商的供需磨合决定了我国数字化市场的形态,造就了我国数字化市场与海…

go map 源码逐行阅读

map粗略介绍 源码开头注释: A map is just a hash table. The data is arranged into an array of buckets. Each bucket contains up to 8 key/elem pairs. The low-order bits of the hash are used to select a bucket. Each bucket contains a few high-order…

Linux学习笔记——RabbitMQ安装部署

5.4、RabbitMQ安装部署 5.4.1、简介 RabbitMQ是一款知名的开源消息列队系统,为企业提供消息的发布、订阅、点对点传输等消息服务。 RabbitMQ在企业开发中十分常见,课程为大家演示快速搭建RabbitMQ环境。 5.4.2、安装 RabbitMQ在yum仓库中的版本比较老…

用于从单细胞FRET数据中提取灵敏度分布的Matlab代码

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 对于分子生物学来讲,生物分析手段的发展,是阐明机理的必要条件。在研究分子间相互作用的道路上&#xf…

Leetcode - 106 - 相交链表

160. 相交链表 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意&am…

【阶段三】Python机器学习04篇:机器学习项目实战:多元线性回归模型、岭回归模型与套索回归模型

本篇的思维导图: 一元线性回归的数学原理 一元线性回归模型又称为简单线性回归模型,其形式可以表示为如下所示的公式。 y=ax+b 其中,y为因变量,x为自变量,a为回归系数,b为截距。 如下图所示,其中y(i)为实际值,y(i)为预测值,一元线性回归的目的就是拟合出一…

Vision-Only Robot Navigation in a Neural Radiance World

Paper name Vision-Only Robot Navigation in a Neural Radiance World Paper Reading Note URL: https://arxiv.org/abs/2110.00168 TL;DR RA-L 2022 文章,提出在 NeRF 表达的环境中进行机器人导航及循迹任务的方法 Introduction 背景 基于 on-board 传感器…

HTML与CSS基础(五)—— CSS布局(盒子模型)、PxCook使用

目标能够认识 盒子模型 的组成部分 能够掌握盒子模型的 边框、内边距、外边距 的作用及简写形式能够计算盒子的 实际大小 能够了解 外边距折叠现象,并知道如何解决 盒子塌陷问题一、PxCook的基本使用1. 通过软件打开设计图① 打开软件 ② 拖拽入设计图 ③ 新建项目2…

Acwing---99.激光炸弹

激光炸弹1.题目2.基本思想3.代码实现1.题目 地图上有 NNN 个目标,用整数 Xi,YiXi,YiXi,Yi 表示目标在地图上的位置,每个目标都有一个价值 WiWiWi。 注意:不同目标可能在同一位置。 现在有一种新型的激光炸弹,可以摧毁一个包含 …

Java中常用API总结(4)—— Object类(含实例解读和源码阅读)

Object类一、前言二、概述1.API帮助文档2.使用方法三、常用方法1.toString方法1️⃣格式2️⃣实例3️⃣源码阅读4️⃣快捷键重写方法2.equals方法1️⃣格式2️⃣实例3️⃣源码阅读4️⃣重写方法3.对象克隆四、结语一、前言 本文将讲述有关于Object类相关知识点 二、概述 1.A…

C语言文件操作的细节

目录 文本文件和二进制文件 概念 一个数据在内存中是怎么存储的呢? 通过VS2013可以查看二进制数值 文件读取结束的判定 文件缓冲区 文本文件和二进制文件 概念 根据数据的组织形式,数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的…