在C语言中,文件是实现数据持久化的核心手段。程序运行时产生的数据默认存放在内存中,一旦程序结束,这些数据就会丢失。通过文件操作,我们可以将数据保存到硬盘上,以便长期存储和重复使用。
C语言通过标准库 <stdio.h> 中定义的一系列函数和 FILE 结构体来管理文件操作。
📁 核心概念
文件指针 (FILE*)
C语言中的所有文件操作都围绕一个核心概念------文件指针 。它并非直接指向磁盘上的文件,而是一个指向内存中 FILE 结构体的指针。这个 FILE 结构体由操作系统和C标准库维护,充当了程序和文件之间的"代理"或"管理员",其中封装了文件的状态信息,例如:
- 文件描述符:操作系统用于标识打开文件的整数。
- 当前文件偏移量:记录了下一次读写操作在文件中的位置。
- 错误标志和文件结束标志:用于判断操作是否出错或是否已读到文件末尾。
文件类型
C语言主要处理两种类型的文件:
- 文本文件 :以ASCII码的形式存储数据,内容是人类可读的字符。例如
.txt,.c文件。在文本模式下,某些字符(如换行符\n)可能会被自动转换。 - 二进制文件 :将数据在内存中的二进制形式原封不动地写入磁盘。例如
.exe,.jpg文件。这种方式更节省空间,读写效率也更高,但内容通常不可直接阅读。
🚀 文件操作基本流程
文件操作遵循一个固定的三步流程:打开 → 读写 → 关闭。
1. 打开文件 (fopen)
使用 fopen 函数打开文件,它会返回一个 FILE* 指针。如果打开失败,则返回 NULL。
c
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r"); // 以只读模式打开文件
if (fp == NULL) { // 必须检查是否打开成功
printf("文件打开失败!\n");
return 1;
}
// ... 进行读写操作 ...
fclose(fp); // 操作完成后关闭文件
return 0;
}
2. 读写文件
根据文件类型和需求,有多种读写函数可供选择。
- 格式化读写 :类似于
printf和scanf,用于处理格式化的文本数据。fprintf(fp, "格式字符串", 变量列表);:将格式化数据写入文件。fscanf(fp, "格式字符串", 变量地址列表);:从文件中读取格式化数据。
- 字符/字符串读写 :用于逐字符或逐行处理文本。
fputc(ch, fp);/fgetc(fp);:写入/读取一个字符。fputs(str, fp);/fgets(buf, size, fp);:写入/读取一个字符串。
- 二进制块读写 :用于高效地读写数组、结构体等二进制数据。
fwrite(ptr, size, count, fp);:将内存中的数据块写入文件。fread(ptr, size, count, fp);:从文件中读取数据块到内存。
3. 关闭文件 (fclose)
文件使用完毕后,必须 调用 fclose 函数关闭。这一步至关重要,因为它会:
- 刷新缓冲区,确保所有暂存在内存中的数据都被写入磁盘。
- 释放系统分配给该文件的资源。
忽略关闭文件可能导致数据丢失或资源泄漏。
📝 文件打开模式
fopen 函数的第二个参数决定了文件的打开方式。以下是常用的打开模式:
| 模式 | 含义 | 文件不存在 | 文件已存在 |
|---|---|---|---|
"r" |
只读 | 打开失败 | 从头开始读取 |
"w" |
只写 | 创建新文件 | 清空原有内容,从头写入 |
"a" |
追加 | 创建新文件 | 在末尾追加内容 |
"r+" |
读写 | 打开失败 | 从头开始读写 |
"w+" |
读写 | 创建新文件 | 清空原有内容,从头读写 |
"rb", "wb", "ab" |
二进制模式 | 同上,但针对二进制文件 |
🎯 其他重要操作
- 文件定位 :可以随机访问文件中的任意位置。
fseek(fp, offset, origin);:将文件位置指针移动到指定位置。origin可以是文件开头 (SEEK_SET)、当前位置 (SEEK_CUR) 或文件末尾 (SEEK_END)。ftell(fp);:返回当前文件位置指针相对于文件开头的偏移量。rewind(fp);:将文件位置指针重置到文件开头。
- 错误与状态检测 :
feof(fp);:检查是否读到文件末尾。ferror(fp);:检查文件操作是否发生错误。
⚠️ 关键注意事项
- 始终检查返回值 :调用
fopen后必须检查返回的指针是否为NULL,以确认文件是否成功打开。 - 务必关闭文件 :任何打开的文件都必须配对使用
fclose,这是良好的编程习惯。 - 理解缓冲区 :写入文件的数据会先存放到内存缓冲区,
fclose或fflush才会真正将数据写入磁盘。这解释了为何不关闭文件会导致数据丢失。