前言
语言中的文件操作是编程中非常重要的一部分,它允许程序与外部数据进行交互,如读取用户输入的数据、保存程序生成的结果到文件中,或者修改现有文件的内容。C语言通过一系列的标准库函数来支持文件操作,这些函数定义在<stdio.h>头文件中。
一、文件概念
1.1 文件的作用
如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使用文件。
1.2 文件分类
磁盘(硬盘)上的⽂件是⽂件。
但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从⽂件功能的角度来分类的)。
1.2.1 程序文件
程序文件,也被称为可执行文件或代码文件,是包含了一系列指令(代码)的文件,这些指令可以被计算机的处理器(CPU)执行以完成特定的任务或功能。程序文件通常是用高级编程语言(如C、C++、Java、Python等)编写的,然后经过编译器或解释器转换成计算机可以直接执行的机器语言或字节码。
程序文件的主要特点包括:
- 包含可执行的代码。
- 通常具有特定的文件扩展名,如.exe(Windows可执行文件)、.com(旧式DOS可执行文件)、.bat(批处理文件)、.py(Python脚本文件,需要解释器执行)、.jar(Java归档文件,包含Java字节码)等。
- 不能直接被用户编辑(除非使用相应的源代码编辑器并重新编译或解释)。
- 执行时,程序文件会加载到内存中,CPU按照程序中的指令序列执行操作。
1.2.2 数据文件
数据文件是存储了数据(如文本、数字、图像等)的文件,这些数据可以被程序读取、修改、添加或删除。数据文件不包含可执行代码,而是作为程序运行的输入或输出。数据文件可以是任何类型的文件,包括但不限于文本文件、图像文件、音频文件、视频文件、数据库文件等。
数据文件的主要特点包括:
- 存储数据,不包含可执行的代码。
- 可以是多种格式,包括文本(.txt)、CSV(.csv,逗号分隔值)、JSON(.json,JavaScript对象表示法)、XML(.xml,可扩展标记语言)、数据库文件(如.db、.sqlite等)等。
- 可以被程序读取和写入,作为程序运行的输入或输出。
- 用户可以直接查看或编辑数据文件(使用相应的编辑器或查看器)。
下面将主要探讨数据文件。
通常我们所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运行结果显示到显示器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。
1.2.3 文件名

1.2.4 二进制文件与文本文件
根据数据的组织形式不同,数据文件被分为二进制文件和文本文件。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
⼀个数据在⽂件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
例如,整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),而⼆进制形式输出,则在磁盘上只占4个字节(VS2019测试)。

测试:
int main()
{
int a = 10000;
FILE* pf = fopen("test.txt", "wb");
fwrite(&a, 4, 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
使用VS打开二进制文件


二、文件操作
2.1 文件的打开与关闭
2.1.1 文件指针
**在C语言中,文件是通过文件指针来访问的。**文件指针是一个指向FILE类型的指针,FILE是在<stdio.h>中定义的一个结构体类型,用于表示一个打开的文件。文件指针用于存储文件的相关信息,如文件的位置、状态等。
例如,VS编译环境中提供的<stdio.h> 头文件中的文件类型申明:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
2.1.2 打开文件
在C语言中,使用fopen函数来打开文件。fopen函数的原型如下:
FILE *fopen(const char *filename, const char *mode)

最低0.47元/天 解锁文章
1345





