6.2 文件读写

本篇学习 `FILE`、打开模式、文本与二进制文件、顺序读写与随机读写,并能完成基础文件处理。

文件读写

概念说明

文件操作让程序的数据可以脱离内存,在程序结束后仍然保留下来。 C 标准库通过 FILE * 表示打开的文件流,并提供一组函数完成读写、定位和关闭。

文件处理大致可以分成几类:

  • 文本读写:例如 fgetsfputsfprintffscanf
  • 二进制块读写:例如 freadfwrite
  • 随机定位:例如 fseekftellrewind

学文件时一定要把“模式对吗、打开成功了吗、最后关闭了吗”当成固定检查项。 这类问题如果忽略,程序往往不是编译时报错,而是运行时行为异常。

语法/规则

  1. fopen 用于打开文件,常见模式有 rwarbwbab
  2. 打开文件后要检查返回值是否为 NULL
  3. 文本写入常见函数有 fputsfprintf,文本读取常见函数有 fgetsfscanf
  4. 二进制块读写常见函数有 freadfwrite
  5. 随机读写常配合 fseekftellrewind 使用。
  6. feofferror 用于辅助判断读写结束原因,不应先用 feof 预测下一次读取是否成功。
  7. 文件使用完毕后要调用 fclose 关闭;长期运行程序里,这一步尤其重要。

示例

文本文件读写

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main(void) {
    char buffer[64];
    FILE *fp = fopen("demo.txt", "w");
    if (fp == NULL) {
        return 1;
    }

    fputs("hello file\n", fp);
    fclose(fp);

    fp = fopen("demo.txt", "r");
    if (fp == NULL) {
        return 1;
    }

    fgets(buffer, sizeof(buffer), fp);
    fclose(fp);

    printf("%s", buffer);
    return 0;
}

输出结果:

1
hello file

二进制块读写与定位

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int main(void) {
    int values[5] = {10, 20, 30, 40, 50};
    int target = 0;
    FILE *fp = fopen("numbers.bin", "wb");
    if (fp == NULL) {
        return 1;
    }

    fwrite(values, sizeof(int), 5, fp);
    fclose(fp);

    fp = fopen("numbers.bin", "rb");
    if (fp == NULL) {
        return 1;
    }

    fseek(fp, 2L * (long)sizeof(int), SEEK_SET);
    fread(&target, sizeof(int), 1, fp);
    fclose(fp);

    printf("third = %d\n", target);
    return 0;
}

输出结果:

1
third = 30

常见错误

  1. fopen 失败后直接继续读写,导致空指针使用问题。
  2. 文件打开模式写错,例如本来想追加却用了 w,结果覆盖了原内容。
  3. 文本和二进制场景混用读写接口,却没有明确自己到底在处理什么格式的数据。
  4. 试图用 feof 预判下一次是否还能读,结果把循环控制写反。
  5. 忘记 fclose,长期运行程序里可能造成资源泄漏或数据未及时落盘。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字