打开与关闭(打开后必须判空,用完必须关闭)
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-命令行参数与排序算法