非常好 👍
这次我们做一份完整、系统、清晰的 C语言文件输入输出笔记,包含两大类文件:
🧾 文本文件(text file)
💾 二进制文件(binary file)
这份内容适合你长期保存复习。
📘 C语言文件读写笔记(完整版)
一、文件操作的基本流程
C 语言所有文件操作都依赖 <stdio.h>
基本步骤:
-
定义文件指针
FILE *fp;
-
打开文件
fp = fopen("文件名", "模式");
-
读写文件
-
文本:
fprintf,fscanf,fgets,fputs -
二进制:
fwrite,fread
-
-
关闭文件
fclose(fp);
二、文件打开模式
| 模式 | 说明 |
|---|---|
"r" |
只读打开(文件必须存在) |
"w" |
写入(文件存在则清空,不存在则创建) |
"a" |
追加写入(写入到末尾) |
"r+" |
读写(文件必须存在) |
"w+" |
读写(创建新文件或清空旧文件) |
"a+" |
读写(文件存在则追加) |
"rb", "wb", "ab" |
同上,但用于二进制文件 |
三、文本文件的读写
📖 写入文本文件
#include <stdio.h>
int main() {
FILE *fp = fopen("output.txt", "w");
if (!fp) {
printf("打开文件失败!\n");
return 1;
}
fprintf(fp, "Hello, world!\n");
fprintf(fp, "数字:%d\n", 123);
fputs("这是另一行文字。\n", fp);
fclose(fp);
return 0;
}📘 说明
-
fprintf():格式化写入(类似printf) -
fputs():直接写字符串
📥 读取文本文件
#include <stdio.h>
int main() {
FILE *fp = fopen("output.txt", "r");
if (!fp) {
printf("文件打开失败!\n");
return 1;
}
char line[100];
while (fgets(line, sizeof(line), fp)) { // 一次读一行
printf("%s", line);
}
fclose(fp);
return 0;
}📘 说明
-
fscanf(fp, "%d", &x):读格式化数据 -
fgets(line, size, fp):读一整行字符串 -
feof(fp):可判断是否到文件结尾
四、二进制文件的读写
二进制文件保存的是原始内存数据,速度快,不可直接用文本编辑器查看。
💾 写入二进制文件(fwrite)
#include <stdio.h>
int main() {
FILE *fp = fopen("data.bin", "wb"); // 以二进制方式写入
if (!fp) {
printf("打开文件失败!\n");
return 1;
}
int nums[] = {10, 20, 30, 40, 50};
fwrite(nums, sizeof(int), 5, fp); // 写入5个int
fclose(fp);
return 0;
}💾 读取二进制文件(fread)
#include <stdio.h>
int main() {
FILE *fp = fopen("data.bin", "rb"); // 以二进制方式读取
if (!fp) {
printf("打开文件失败!\n");
return 1;
}
int nums[5];
fread(nums, sizeof(int), 5, fp); // 从文件读取5个int
for (int i = 0; i < 5; i++) {
printf("nums[%d] = %d\n", i, nums[i]);
}
fclose(fp);
return 0;
}五、读写结构体的例子(重点)
#include <stdio.h>
typedef struct {
char name[20];
int age;
double score;
} Student;
int main() {
Student stu1 = {"Alice", 20, 95.5};
Student stu2;
// 写入
FILE *fp = fopen("student.bin", "wb");
fwrite(&stu1, sizeof(Student), 1, fp);
fclose(fp);
// 读取
fp = fopen("student.bin", "rb");
fread(&stu2, sizeof(Student), 1, fp);
fclose(fp);
printf("姓名: %s\n年龄: %d\n分数: %.1f\n", stu2.name, stu2.age, stu2.score);
return 0;
}🧠 这种方法常用于保存游戏存档、数据库记录、配置文件等。
六、文本 vs 二进制 文件对比总结
| 对比项 | 文本文件 | 二进制文件 |
|---|---|---|
| 读写函数 | fprintf, fscanf, fgets, fputs |
fwrite, fread |
| 内容格式 | 可读的 ASCII 字符 | 原始字节数据 |
| 文件大小 | 通常较大(有换行和字符编码) | 较小、紧凑 |
| 可直接查看 | ✅ 是 | ❌ 否 |
| 速度 | 较慢 | 较快 |
| 适合 | 配置、日志、报告 | 图片、音频、结构体数据 |
七、补充:安全与检测
-
判断文件是否打开成功:
if (fp == NULL) { ... }
-
判断是否到达文件结尾:
while (!feof(fp)) { ... }
-
关闭文件(一定要):
fclose(fp);
八、示意图 🧭
程序内存 ←→ 文件指针 ←→ 磁盘文件
↑
fread / fwrite (二进制)
fscanf / fprintf (文本)
✅ 总结口诀
fopen 打开先,
fprintf/fscanf 写与读;
fwrite/fread 传二进,
fclose 结束莫忘记。