首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >深入解析文件操作(上)- 二进制文件和文本文件,流的概念,文件的打开和关闭

深入解析文件操作(上)- 二进制文件和文本文件,流的概念,文件的打开和关闭

作者头像
云泽808
发布2025-12-30 17:26:31
发布2025-12-30 17:26:31
2370
举报

一、为什么使用文件?

在此篇内容之前,所写的程序的数据都是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等在此运行程序,是看不到上次程序的数据的。

像平时手机的通讯录里存有朋友的信息,这些数据不会因为手机的关机就消失了。

所以想要将数据进行持久化的保存,就要使用文件

二、什么是文件?

平时买的电脑一般都有以下数据:

文件就是存储在电脑硬盘上的。

在程序设计中,一般将文件分为两种:程序文件、数据文件(从文件功能的角度来分类的)

2.1 程序文件

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

2.2 数据文件

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

之前代码中所处理数据的输入输出都是以终端为对象,即从终端的键盘输入数据,运行结果显示到显示器上。

其实有时候也可以把信息输出到硬盘上,当需要的时候再从硬盘上把数据读取到内存中使用,这里处理的就是硬盘上文件。

2.3 文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。 文件名包含3部分:文件路径+文件名主干+文件后缀 例如:c:\code\test.txt 为了方便起见,文件表示常被称为文件名


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

根据数据的组织形式,数据文件被称为文本文件二进制文件

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

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

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

比如说这里的.c文件用记事本打开

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

这就是文本文件

可执行程序exe用记事本打开

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

文件里存的是二进制信息,用记事本这样的文本编辑器打开时根本看不懂

一个数据在文件中是怎么存储的呢? 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到硬盘,则硬盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节

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

字符1的ASCII为49,0为48

测试代码

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

程序运行结束后在代码所在的路径下多一个文件叫test.txt,以记事本打开

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

可以发现看不懂,因为是以二进制的形式放到文件中去的

这里要看懂他走以下步骤

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

直接双击打开依旧看不懂

右键

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

这里的10 27 00 00 就是10000

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

以上原理得以证实


四、文件的打开和关闭

4.1 流和标准流

4.1.1 流

一般程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同。

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

为了方便程序员对各种设备进行方便的操作,就抽象出了流的概念,我们可以把流想象成流淌着字符的河。

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

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

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

4.1.2 标准流

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢? 那是因为C语言程序在启动的时候,默认打开了3个流:

  • stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
  • stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
  • stderr - 标准错误流,错误信息的打印,大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出的操作的。 stdin、stdout、stderr三个流的类型是:FILE *,通常称为文件指针 C语言中,就是通过FILE *的文件指针来维护流的各种操作的。

4.2 文件指针

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

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

例如:VS2013编译器环境提供的stdio.h头文件中有以下的文件类型声明:

代码语言:javascript
复制
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* 的指针变量;

代码语言:javascript
复制
FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件

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

4.3 文件的打开和关闭

4.3.1 fopen
代码语言:javascript
复制
//打开文件
FILE* fopen( const char* filename,const char* mode );

功能:fopen函数是用来打开参数filename指定的文件,同时将打开的文件和一个流进行关联,后续对流的操作是通过fopen函数返回的指针来维护。具体对流(关联的文件)的操作是通过参数mode来指定的。

参数: filename:表示被打开的文件的名字,这个名字可以绝对路径,也可以是相对路径。 mode:表示对打开的文件的操作方式,具体见下面的表格

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

看表格之前先看这张图,上方箭头的意思是把内存中的数据放到文件中去。下方的箭头是从文件中拿数据到程序中去

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

返回值

  • 若文件成功打开,该函数将返回一个指向FILE对象的指针,该指针可用于后续操作中标识对应的流。
  • 若打开失败,则返回NULL指针,所以一定要fopen的返回值做判断,来验证文件是否打开成功。

实例代码

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

这里把刚刚的文件删了,把操作方式改为读数据。

在当前工程目录有data.txt的情况下,无论使用

代码语言:javascript
复制
FILE* pf = fopen("./data.txt", "r");
FILE* pf = fopen("data.txt", "r");

两种方式读数据都是可以的

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

这里把文件放到程序当前路径的上一级路径的上一级路径的test文件里test2中

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

也是成功打开了

如果把文件放到桌面上,使用相对路径比较麻烦,这里也可以写为绝对路径

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

找到桌面上的文件,右击点击属性

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

将位置拷贝

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

成功打开,这里使用斜杠也可以,但建议使用两个//,以免和其他字符搭配构成转义字符

代码语言:javascript
复制
FILE* pf = fopen("C:\\Users\\23927\\Desktop\\data.txt", "r");

C语言常见概念

4.3.2 fclose
代码语言:javascript
复制
int fclose ( FILE* stream );

功能:关闭参数stream关联的文件,并取消其关联关系。与该流关联的所有内部缓冲区均会接触关联并刷新;任何未写入的输出缓冲区内容将被写入,任何未读取的输入缓冲区内容将被丢弃。

细说一下什么意思,例如代码在执行写文件操作时,不会将数据直接放到文件中去,而是在中间维护一个缓冲区,先将数据写入缓冲区,然后将缓冲区的数据再写入文件中

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

总结

以上就是文件操作(上)的全部内容了,本来准备一次性写完的,结果发现内容真的很多,越写越离谱,分为了两篇。喜欢的兄弟们不要忘记一键三连给予支持~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、为什么使用文件?
  • 二、什么是文件?
    • 2.1 程序文件
    • 2.2 数据文件
    • 2.3 文件名
  • 三、二进制文件和文本文件
  • 四、文件的打开和关闭
    • 4.1 流和标准流
      • 4.1.1 流
      • 4.1.2 标准流
    • 4.2 文件指针
    • 4.3 文件的打开和关闭
      • 4.3.1 fopen
      • 4.3.2 fclose
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档