1. 为什么需要文件操作?
在C语言编程中,文件操作是一个极其重要的基础技能。想象一下,你开发了一个学生成绩管理系统,如果没有文件操作功能,每次程序关闭后所有数据都会消失,这显然不实用。文件操作让数据能够持久化保存,就像给程序装上了记忆功能。
我刚开始学习文件操作时,最大的困惑是理解"流"(stream)这个概念。简单来说,你可以把文件看作是一个数据流,程序通过文件指针来访问这个流中的数据。就像用水管接水一样,文件指针就是水龙头开关,控制着数据的流动方向和流量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件操作基础概念
2.1 文件类型
C语言中主要处理两种文件类型:
- 文本文件:人类可读的字符序列,如.txt文件
- 二进制文件:直接存储内存中的二进制数据,如图片、音频等
初学者常犯的错误是混淆这两种文件类型。我曾经尝试用文本模式打开一个JPEG图片文件,结果程序直接崩溃了。记住:文本文件适合存储字符串,二进制文件适合存储任何类型的数据。
2.2 文件指针
FILE是C标准库中定义的结构体类型,每个打开的文件都有一个对应的FILE指针。这个指针包含了文件的各种信息:
- 文件位置指示器
- 错误指示器
- 文件结束指示器
- 缓冲区信息
实际操作中,我们不需要关心FILE结构的具体内容,只需要知道如何正确使用文件指针即可。
3. 文件操作基本流程
3.1 打开文件
使用fopen函数打开文件:
c复制FILE *fopen(const char *filename, const char *mode);
常见的打开模式:
- "r":只读模式(文件必须存在)
- "w":写入模式(创建新文件或清空已有文件)
- "a":追加模式(在文件末尾添加内容)
- "r+":读写模式(文件必须存在)
- "w+":读写模式(创建新文件或清空已有文件)
- "a+":读写模式(在文件末尾添加内容)
重要提示:每次打开文件后都要检查返回值是否为NULL,这是新手最容易忽略的安全问题。
3.2 读写文件
3.2.1 文本文件读写
常用函数:
- fgetc/fputc:单个字符读写
- fgets/fputs:字符串读写
- fprintf/fscanf:格式化读写
示例代码:
c复制// 写入文本文件
FILE *fp = fopen("test.txt", "w");
if(fp != NULL) {
fprintf(fp, "Hello, World!\n");
fclose(fp);
}
// 读取文本文件
fp = fopen("test.txt", "r");
if(fp != NULL) {
char buffer[100];
while(fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
}
3.2.2 二进制文件读写
常用函数:
- fread/fwrite:块读写
示例代码:
c复制struct Student {
char name[20];
int age;
float score;
};
// 写入二进制文件
struct Student stu = {"张三", 20, 89.5};
FILE *fp = fopen("student.dat", "wb");
if(fp != NULL) {
fwrite(&stu, sizeof(struct Student), 1, fp);
fclose(fp);
}
// 读取二进制文件
fp = fopen("student.dat", "rb");
if(fp != NULL) {
struct Student read_stu;
fread(&read_stu, sizeof(struct Student), 1, fp);
printf("姓名:%s,年龄:%d,成绩:%
