第27章 文件操作(一):文件指针、打开与关闭、打开模式

文件操作,说白了就是让程序和磁盘上的文件打交道。你写的数据要存下来,存到哪?文件。你要读配置、读数据,从哪读?文件。我刚开始学C的时候,觉得文件操作可有可无,直到有一次写个小工具,数据死活存不下来,才意识到——没有文件操作,程序就是个“一次性用品”。

27.1 文件指针(FILE*)——操作文件的“遥控器”

在C语言里,我们操作文件不是直接碰磁盘的。系统给我们提供了一个结构体,叫FILE。你不需要知道它里面长什么样,你只需要知道:每个打开的文件,都有一个FILE结构体对应

我们通过一个指针来操控它:

FILE *fp;

这个fp就是文件指针。你可以把它想象成遥控器——你按按钮(调用函数),遥控器(文件指针)去指挥电视(文件)。

核心要点:文件指针是后续所有文件操作函数的“通行证”。没有它,你什么都干不了。

我个人习惯给文件指针取名fp,简单明了。当然你也可以叫pFilef,但别搞得太花哨,团队里别人看着累。

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 知识体系图

下面这张图帮你理清文件操作的核心流程:

文件操作核心流程 FILE *fp fopen("文件", "模式") fp == NULL? 返回错误 读写操作(fprintf/fscanf等) fclose(fp) 每一步都要检查返回值,确保操作成功

27.7 避坑总结

  • 忘记检查fopen返回值——文件没打开,后面全白干。我曾经调试了半天,结果发现是文件名写错了。
  • 忘记fclose——数据没写进去、文件被占用、内存泄漏。三连坑。
  • 用错模式——"w"会清空文件,"r"要求文件存在。用之前想清楚。
  • 路径问题——相对路径是相对于程序的工作目录,不是exe所在目录。这个坑我见过无数次。

文件操作是C语言里非常实用的技能。你掌握了打开、关闭、模式选择,后面再学读写函数就轻松多了。记住:先检查,再操作;用完就关,别偷懒


专注资料整理