第27章 文件操作(一):文件指针、打开与关闭、打开模式
文件操作,说白了就是让程序和磁盘上的文件打交道。你写的数据要存下来,存到哪?文件。你要读配置、读数据,从哪读?文件。我刚开始学C的时候,觉得文件操作可有可无,直到有一次写个小工具,数据死活存不下来,才意识到——没有文件操作,程序就是个“一次性用品”。
27.1 文件指针(FILE*)——操作文件的“遥控器”
在C语言里,我们操作文件不是直接碰磁盘的。系统给我们提供了一个结构体,叫FILE。你不需要知道它里面长什么样,你只需要知道:每个打开的文件,都有一个FILE结构体对应。
我们通过一个指针来操控它:
FILE *fp;
这个fp就是文件指针。你可以把它想象成遥控器——你按按钮(调用函数),遥控器(文件指针)去指挥电视(文件)。
核心要点:文件指针是后续所有文件操作函数的“通行证”。没有它,你什么都干不了。
我个人习惯给文件指针取名fp,简单明了。当然你也可以叫pFile、f,但别搞得太花哨,团队里别人看着累。
27.2 打开文件:fopen()——你得先“敲门”
操作文件的第一步,是打开它。C语言里用fopen()函数:
FILE *fopen(const char *filename, const char *mode);
它接受两个参数:
- filename:文件名(可以带路径)
- mode:打开模式(告诉系统你要干嘛)
返回值是一个FILE*指针。如果打开失败,返回NULL。
举个例子:
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return -1;
}
⚠️ 重要:每次打开文件后,必须检查返回值是否为NULL。我在项目中遇到过好几次,文件路径写错了、文件被占用了、权限不够……不检查就直接用,程序直接崩溃。这坑我踩过,你别踩。
27.3 文件打开模式——告诉系统你要干嘛
打开模式决定了你能对文件做什么。我整理了一张表,你直接看:
| 模式 | 含义 | 文件不存在时 | 文件存在时 |
|---|---|---|---|
"r" |
只读 | 返回NULL | 正常打开 |
"w" |
只写 | 创建新文件 | 清空原有内容 |
"a" |
追加 | 创建新文件 | 保留内容,在末尾写入 |
"r+" |
读写(从文件头开始) | 返回NULL | 正常打开 |
"w+" |
读写(先清空) | 创建新文件 | 清空原有内容 |
"a+" |
读写(追加模式) | 创建新文件 | 保留内容,在末尾写入 |
嗯,这里要注意:"r"和"r+"要求文件必须存在,否则返回NULL。而"w"和"w+"会直接清空文件——你想想看,如果你不小心用了"w",而文件里有重要数据……那就全没了。我曾经手滑过一次,写测试代码时用了"w",结果把同事的配置文件给清了。从那以后,我写文件前都会再三确认模式。
💡 小技巧:如果你不确定文件是否存在,又不想丢失数据,用"a"或"a+"。它们不会清空文件,只会追加内容。
27.4 关闭文件:fclose()——用完记得关门
文件用完了,要关掉。就像你离开房间要关门一样。C语言里用fclose():
int fclose(FILE *fp);
成功返回0,失败返回EOF(一般是-1)。
if (fclose(fp) != 0) {
printf("文件关闭失败!\n");
}
⚠️ 警告:不关闭文件会怎样?内存泄漏、文件被占用、数据丢失。尤其是写文件时,数据可能还在缓冲区里,没真正写到磁盘。只有调用了fclose(),缓冲区才会被刷新。我见过有人写了几百行数据,程序崩溃了,结果文件里啥都没有——就是因为没关文件。
27.5 完整示例:打开、写入、关闭
来,看一个完整的例子:
#include <stdio.h>
int main() {
FILE *fp = fopen("hello.txt", "w");
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
fprintf(fp, "Hello, 文件操作!\n");
fprintf(fp, "这是第二行。\n");
if (fclose(fp) != 0) {
printf("关闭文件失败\n");
return 1;
}
printf("写入成功!\n");
return 0;
}
这个程序做了三件事:打开文件、写入两行文字、关闭文件。每一步都检查了返回值。你想想看,如果中间任何一步出错了,程序都能及时告诉你,而不是默默崩溃。
27.6 知识体系图
下面这张图帮你理清文件操作的核心流程:
27.7 避坑总结
- 忘记检查fopen返回值——文件没打开,后面全白干。我曾经调试了半天,结果发现是文件名写错了。
- 忘记fclose——数据没写进去、文件被占用、内存泄漏。三连坑。
- 用错模式——
"w"会清空文件,"r"要求文件存在。用之前想清楚。 - 路径问题——相对路径是相对于程序的工作目录,不是exe所在目录。这个坑我见过无数次。
文件操作是C语言里非常实用的技能。你掌握了打开、关闭、模式选择,后面再学读写函数就轻松多了。记住:先检查,再操作;用完就关,别偷懒。