《文件操作》

一 . 文本文件和二进制文件

根据数据的组织形式,数据文件被分为了二进制文件和文本文件
数据在内存中是以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件
如果要求在外存上以ASCII 码的形式存储,则需要再存储前转换,以ASCII码的形式存储的文件就是文本文件

简单来说二进制文件就是我们看不懂的文件,而文本文件是直接可以看懂的文件

⼀个数据在文件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),
以⼆进制形式输出,则在磁盘上只占4个字节。
在这里插入图片描述

代码示例;

在这里插入图片描述
在这里插入图片描述
可以看到以二进制方式打开的时候我们是看不懂里面的内容的。

二. 文件的打开和关闭

1. 流和标准流

(1)流

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

(2) 标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开呢?
那是因为C语言程序在启动的时候,默认打开了3个
stdin–标准输⼊流,在⼤多数的环境中从键盘输入,scanf函数就是从标准输⼊流中读取数据。
stdout–标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
stderr—标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanfprintf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr三个流的类型是: FILE * ,通常称为文件指针。
C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。

2. 文件指针

在这里插入图片描述
对于文件的操作我们都是通过文件指针来实现的。

(1) 文件指针的形式

在这里插入图片描述

3. 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建立了指针和文件的关系。
ANSIC规定使用 fopen 函数来打开文件, fclose 来关闭文件。
在这里插入图片描述
其中的mode表示打开方式
在这里插入图片描述

代码示例:
(1)以读的方式打开

在这里插入图片描述
因为这里我们的源文件底下并没有创建这个文件所以这里显示打开失败。

当我们创建好之后再打开就没问题了

在这里插入图片描述
在这里插入图片描述

(2)以写的方式打开

在这里插入图片描述
在以写的方式打开之前我们把之前的文件删除了,但是这里还是成功打开了
在这里插入图片描述
可以看到这里还把要写的内容写到了文件里面。

这是因为以写的方式和以读的方式打开文件的区别;

  1. 当你以读的方式打开文件时,如果没有这个文件就会打开失败
  2. 当你以写的方式打开文件时,即使没有这个文件,它也会自己创建一个文件然后打开
  3. 如果一旦打开失败的话就会返回空指针(NULL)
(3)按照路径打开文件

在这里插入图片描述
在这里插入图片描述
这里要注意一个细节:
在这里插入图片描述

三. 文件的顺序读写

在这里插入图片描述

1. fgetc和fputc函数

(1) fgetc函数介绍

在这里插入图片描述
可以看到该函数的返回值为int类型的,所以在读取到内容时就需要一个int类型的变量来接收

首先我们创建一个文件并往里面放一些内容
在这里插入图片描述
在这里插入图片描述
为了得到文件中的所有内容,所以这里我们利用了一个while循环,因为fgetc的停止条件是遇到错误,所以这里循环的条件就是fgetc得到的返回值!= EOF,这样就读取到了所有的字符

(2) fputc 函数介绍

在这里插入图片描述

通过该函数的介绍,我们可以发现这个函数的返回值的类型也为int类型,这就和fgetc对应上了。
在这里插入图片描述
stdin -- 标准输入
stdout -- 标准输出

2. fgetcs 和fputs函数介绍

(1)fputs函数介绍

在这里插入图片描述

通过该函数的介绍,我们可以看到这个函数的返回值为int类型,包含两个参数,第一个就是字符串的地址,一个是流的地址,也就是文件指针。

在这里插入图片描述
在这里插入图片描述
这里需要注意的是,如果在写入两个字符串时,如果不自己加上换行符的话,第二个字符串就会追加在第一个字符串后面
并且如果第二次打开相同的文件再写入的话,它是会删除掉原文件中的内容然后再重新写入的

(2)fgets函数介绍

通过这个函数的介绍可以看到这个函数的返回值的类型为char*,包含三个参数,第一个参数就是char*的一个指针,这个参数代表着我们把读取到的内容存放到的那个地址,第二个参数是int类型的,代表着读取的个数,第三个参数就代表着从哪读取,也就是文件指针。
在这里插入图片描述
这里要注意的是虽然这里我们是读取5个,但其实第五个就是\0这也算读取结束的一个标志吧
并且这里需要注意的是在读取的时候一次只能读取一行
如果要读取两行内容就需要读取两次

如果不信的话可以通过调试来看一下:
在这里插入图片描述
可以看到第五个读取的确实就是\0

3. fscnaf 和 fprintf 函数

(1) fprintf 函数介绍

在这里插入图片描述
通过该函数的介绍,其实不难发现这个函数相对较于printf函数就差了一个文件指针
会写printf函数就会写这个,就把它当做printf来写,最后再加上一个文件指针就行
在这里插入图片描述
在这里插入图片描述

(2) fscanf 函数介绍

在这里插入图片描述
通过该函数的介绍,可以发现这个函数和scanf函数也是只差了一个参数,也就是文件指针。

既然我们会写scanf函数,那么我们也就会写这个函数了;
在这里插入图片描述

4. fread 和fwrite函数

(1)fwrite 函数介绍

在这里插入图片描述
通过该函数的介绍,我们发现这个函数返回值为一个正整数,包含四个参数,第一个参数就是一个void*的指针,代表了要写入的数据的原地址,第二个参数代表了每个数据的大小,第三个参数就是数据的个数,第四个参数就是文件指针

在这里插入图片描述
可以看到这个时候已经以二进制的形式写入了,但是我们是看不懂的。
并且需要注意的是因为是二进制的读和写文件,所以这里在打开文件的时候是wb

(2)fread 函数介绍

在这里插入图片描述

通过对该函数的介绍,我们可以看到这个函数和fwrite函数的返回值和参数是一样的,只是一点不同的是第一个参数就成了读取到的数据存放位置的地址了
在这里插入图片描述

5. scanf、printf 函数和 fscanf 、fprintf 函数的对比

** 前者是针对标准输入和输出的格式化输入和输出函数**
** 后者是针对所有输入流和输出流的格式化的输入和输出函数**

6. sscanf 和sprintf函数

(1)sprintf函数介绍

在这里插入图片描述
通过该函数的介绍,可以看到该函数的返回值为int类型,包含第一个参数是一个char*的指针,也就是输出的数据存放的地址,后面的写法就和printf函数的写发一样了

(2)sscanf函数介绍

在这里插入图片描述
通过该函数的介绍,我们发现这个函数除了第一个参数和scanf函数不一样,其他的都一样,这里的第一个参数就是sprintf转化为的字符串的地址

在这里插入图片描述
可以看到sprintf把一些格式化的数据整合成了一个字符串的形式,而sscanf将整合好的字符串分解成了格式化的数据

四. 文件的随机读写

1. fseek定位文件指针

(1)介绍

在这里插入图片描述
通过该函数的介绍,我们可以看到该函数的返回值类型为int,包含三个参数,第一个参数就是文件指针,第二个参数就是文件指针偏移的长度,第三个参数就是偏移的参考点
参考点:
在这里插入图片描述
起始位置 、当前位置、末尾位置

(2)举例

在这里插入图片描述

这里需要注意的一个点就是每读取完一个数据之后,文件指针就会往后走一个单位长度,这是容易忽略的一个点,其他的没啥好说的

2. ftell函数

(1)介绍

在这里插入图片描述
通过该函数的介绍,我们可以知道该函数可以返回文件指针相对于起始位置的偏移量,这个和之前在学内存对齐时的求各成员相对于起始位置时用到的offsetof很像

(2) 例子

在这里插入图片描述

3. rewind函数

(1)介绍

在这里插入图片描述
通过该函数的介绍,我们可以看到该函数可以让文件指针回到起始位置

(2)例子

在这里插入图片描述

五. 文件结束的判定

在这里插入图片描述

六. 文件缓冲区

ANSIC标准采用“缓冲文件系统”处理数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每⼀个正在使用的文件开辟⼀块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

在这里插入图片描述

这里可以得出⼀个结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。

完结撒花❀❀❀
在这里插入图片描述

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

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

相关文章

监控报警系统的指标、规则与执行闭环

随笔 从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条? 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 java 老矣,尚能饭否? 一骑红尘妃子笑,无人知是荔枝来! 有所依 我们如何知道系统交易…

LLaMA-Mesh: Unifying 3D Mesh Generation with Language Models 论文解读

目录 一、概述 二、相关工作 1、LLMs到多模态 2、3D对象生成 3、自回归的Mesh生成 三、LLaMA-Mesh 1、3D表示 2、预训练模型 3、有监督的微调数据集 4、数据集演示 四、实验 1、生成的多样性 2、不同模型text-to-Mesh的比较 3、通用语境的评估 一、概述 该论文首…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

ES6 、ESNext 规范、编译工具babel

ES6 、ESNext 规范、编译工具简介 ES6ES(ECMAScript) vs JS常量进一步探讨 obj对象的扩展面试:使对象属性也不能更改——Object.freeze(obj) 解构deconstruction变量的解构赋值:数组解构赋值:对象解构赋值:…

【MyBatis】全局配置文件—mybatis.xml 创建xml模板

文章目录 模板文件配置元素typeAliasessettings 模板文件 创建模板 按照顺序打开【File】–>【settings】–>【Editor】–>【File and Code Templates】&#xff08;或直接搜索&#xff09; <?xml version"1.0" encoding"UTF-8" ?> <…

小程序免备案:快速部署与优化的全攻略

小程序免备案为开发者提供了便捷高效的解决方案&#xff0c;省去繁琐的备案流程&#xff0c;同时通过优化网络性能和数据传输&#xff0c;保障用户体验。本文从部署策略、应用场景到技术实现&#xff0c;全面解析小程序免备案的核心优势。 小程序免备案&#xff1a;快速部署与优…

【数据结构】—— 线索二叉树

引入 我们现在提倡节约型杜会&#xff0c; 一切都应该节约为本。对待我们的程序当然也不例外&#xff0c;能不浪费的时间或空间&#xff0c;都应该考虑节省。我们再观察团下图的二叉树&#xff08;链式存储结构)&#xff0c;会发现指针域并不是都充分的利用了&#xff0c;有许…

Outlook for Mac同步错误:The total attachment size exceeds the limit.

现象 mac一直弹出同步错误提示&#xff1a;The total attachment size exceeds the limit. 怎么也去不掉 解决办法 ①清除收件箱和已发送邮件的缓存 ②删除邮箱账号再重新添加

IT服务团队建设与管理

在 IT 服务团队中&#xff0c;需要明确各种角色。例如系统管理员负责服务器和网络设备的维护与管理&#xff1b;软件工程师专注于软件的开发、测试和维护&#xff1b;运维工程师则保障系统的稳定运行&#xff0c;包括监控、故障排除等。通过清晰地定义每个角色的职责&#xff0…

使用树莓派安装shairport-sync使老音响变身AirPlay音响

借助shairport-sync&#xff0c;可以让普通音响变成AirPlay无线音响&#xff0c;由于树莓派天生的低功耗&#xff0c;做这种事情最适合。所以架构就是树莓派安装Ubuntu24.04&#xff0c;在树莓派上安装shairport-sync&#xff0c;树莓派再通过3.5mm线连接音响。 安装Ubuntu24.…

全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS系统定制开发

8、RTOS系统定制开发 此处以在rtos/components/aw目录下创建一个简单的软件包为例&#xff0c;帮助客户了解RTOS环境&#xff0c;为RTOS系统定制开发提供基础。 RTOS环境下的软件包主要由三部分组成&#xff0c;源文件&#xff0c;Makefile&#xff0c;Kconfig&#xff0c;如下…

用CAXA CAD电子图板导入图框、标题栏并导出pdf的方法

1.导入图框&#xff1a; 点击调入图框->出现读入图框文件 一个一个点击&#xff0c;选择合适的图框 然后点击导入 2.导入标题栏&#xff1a; 调入标题栏->出现读入标题栏文件 一个一个点击&#xff0c;选择合适的标题栏&#xff0c;然后点击导入 3.导出pdf&#x…

【Linux 篇】Docker 启动和停止的精准掌舵:操控指南

文章目录 【Linux 篇】Docker 启动和停止的精准掌舵&#xff1a;操控指南前言docker基本命令1. 帮助手册 2. 指令介绍 常用命令1. 查看镜像2. 搜索镜像3. 拉取镜像4. 删除镜像5. 从Docker Hub拉取 容器的相关命令1. 查看容器2. 创建与启动容器3. 查看镜像4. 启动容器5. 查看容…

Java---反射机制

JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c; 都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 在编译后产生…

Mac配置maven环境及在IDEA中配置Maven

Mac配置maven环境及在IDEA中配置Maven 1. 介绍 Maven是一款广泛用于Java等JVM语言项目的工具&#xff0c;它以项目对象模型&#xff08;POM&#xff09;为基础进行项目管理&#xff0c;通过POM文件来定义项目信息和依赖关系。同时&#xff0c;它也是构建自动化工具&#xff0…

知乎日报——第二周

知乎日报——第二周 文章目录 知乎日报——第二周本周总结ModelViewController无限右滑预加载 总结 本周总结 本周主要完成了知乎日报的详情页面&#xff0c;实现了无限右滑和动态申请详情页的内容&#xff0c;实现了预先加载。以及通过位置获取相应的格外信息&#xff0c;使用…

非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 2

七、创建前端项目 你下载了nodejs吗&#xff1f;从cn官网下载&#xff1a;http://nodejs.cn/download/&#xff0c;或者从一个国外org网站下载&#xff0c;选择自己想要的版本https://nodejs.org/download/release/&#xff0c;双击下载好的安装文件&#xff0c;选择安装路径安…

Windows 软件之 FFmpeg

文章目录 前言1 FFmpeg 视频处理1.1 编解码1.2 其它视频编辑命令1.3 视频抽帧 2 FFmpeg 音频处理3 FFmpeg 图片处理3.1 编解码3.2 拼接图片3.3 图片合成视频 附录1&#xff1a;mediainfo.ps1 前言 FFmpeg 是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的…

Docker1:认识docker、在Linux中安装docker

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…