15 · 文件读写

2026.09.27 · 🟡 中

打开与关闭(打开后必须判空,用完必须关闭)

FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {                 // ✅ 永远先判空
    perror("打开失败");
    return -1;
}
/* ... 读写 ... */
fclose(fp);                       // ✅ 必须关闭,否则资源泄漏

打开模式

模式 含义
"r" 只读,文件必须存在
"w" 只写,清空原内容或新建
"a" 追加,写到末尾
"r+" 读写,文件必须存在
"w+" 读写,清空或新建
"rb"/"wb" 二进制模式(Windows 下换行处理不同)

常用读写函数

函数 用途
fgetc / fputc 读写单个字符
fgets / fputs 读写一行(fgets 安全)
fscanf / fprintf 格式化读写
fread / fwrite 二进制块读写
feof 是否到文件末尾
rewind / fseek 移动文件指针

写文件示例

FILE *fp = fopen("scores.txt", "w");
if (!fp) return -1;
fprintf(fp, "%s %d %.1f\n", "Tom", 18, 95.5);
fclose(fp);

读文件示例(按行读最实用)

FILE *fp = fopen("scores.txt", "r");
if (!fp) return -1;
char line[256];
while (fgets(line, sizeof(line), fp) != NULL) {   // 读到 NULL 表示结束
    printf("%s", line);
}
fclose(fp);

常见坑

  • 忘记 fclose → 缓冲区没刷盘、句柄泄漏。
  • 用 "w" 想读文件 → 结果把文件清空了。
  • while (!feof(fp)) 这种写法容易多读一次(经典 bug),推荐直接判断 fgets 返回值。

关联

14-输入输出 · 12-结构体 · 21-命令行参数与排序算法