C语言文件读写模式详解
在C语言中,使用 fopen() 函数打开文件时需要指定文件访问模式,这些模式决定了文件如何被打开和使用。
🔧 fopen() 函数原型
FILE *fopen(const char *filename, const char *mode);
📌 基本文件模式
1. 文本模式(默认)
| 模式 | 含义 | 作用 |
|---|---|---|
"r" |
read | 只读,文件必须存在 |
"w" |
write | 只写,文件不存在则创建,存在则清空 |
"a" |
append | 追加,文件不存在则创建,存在则在末尾追加 |
"r+" |
read+ | 读写,文件必须存在 |
"w+" |
write+ | 读写,文件不存在则创建,存在则清空 |
"a+" |
append+ | 读写追加,文件不存在则创建,存在则追加 |
2. 二进制模式
在每个模式后加 b:
"rb","wb","ab","r+b","w+b","a+b"
📖 详细说明
1. **只读模式 "r"
FILE *fp = fopen("data.txt", "r");
// 只能读取文件,文件必须已存在
// 如果文件不存在,fopen() 返回 NULL
2. **只写模式 "w"
FILE *fp = fopen("data.txt", "w");
// 只能写入文件
// 如果文件不存在,创建新文件
// 如果文件存在,清空原内容
3. **追加模式 "a"
FILE *fp = fopen("log.txt", "a");
// 只能写入,但总是在文件末尾追加
// 如果文件不存在,创建新文件
// 如果文件存在,保留原内容,新内容追加到末尾
4. **读写模式 "r+"
FILE *fp = fopen("data.txt", "r+");
// 既可读也可写
// 文件必须已存在
// 文件指针开始时指向文件开头
5. **读写模式 "w+"
FILE *fp = fopen("data.txt", "w+");
// 既可读也可写
// 文件不存在则创建,存在则清空
// 文件指针开始时指向文件开头
6. **追加读写模式 "a+"
FILE *fp = fopen("data.txt", "a+");
// 既可读也可写
// 文件不存在则创建
// 写入时总是在末尾追加
// 读取时可以访问整个文件
🎯 二进制模式 vs 文本模式
文本模式(如 "r", "w")
- Windows :自动转换
\n↔\r\n - 适合:文本文件、人类可读数据
二进制模式(如 "rb", "wb")
- 不进行任何转换:原样读写字节
- 适合:图片、音频、可执行文件、结构体数据
示例:
// 文本模式 - 会转换换行符
FILE *txt = fopen("text.txt", "w");
fprintf(txt, "Hello\nWorld\n");
// 二进制模式 - 原样保存
FILE *bin = fopen("data.bin", "wb");
fwrite(&data, sizeof(data), 1, bin);
🧪 实际应用示例
1. 创建并写入文件
FILE *fp = fopen("output.txt", "w");
if (fp != NULL) {
fprintf(fp, "Hello, World!\n");
fclose(fp);
} else {
printf("无法创建文件\n");
}
2. 追加到现有文件
FILE *fp = fopen("log.txt", "a");
if (fp != NULL) {
fprintf(fp, "时间: %s", __DATE__);
fclose(fp);
}
3. 读取现有文件
FILE *fp = fopen("input.txt", "r");
if (fp != NULL) {
char buffer[100];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
} else {
printf("文件不存在\n");
}
4. 二进制文件操作
// 写入二进制数据
int numbers[] = {1, 2, 3, 4, 5};
FILE *out = fopen("numbers.bin", "wb");
fwrite(numbers, sizeof(int), 5, out);
fclose(out);
// 读取二进制数据
int read_numbers[5];
FILE *in = fopen("numbers.bin", "rb");
fread(read_numbers, sizeof(int), 5, in);
fclose(in);
⚠️ 重要注意事项
1. 错误检查
FILE *fp = fopen("file.txt", "r");
if (fp == NULL) {
perror("fopen"); // 打印系统错误信息
return -1;
}
2. 模式选择原则
- 文本文件 :使用
"r","w","a" - 二进制文件 :使用
"rb","wb","ab" - 需要保留原内容 :使用
"a"或"a+" - 清空原内容 :使用
"w"或"w+"
3. 文件指针位置
"w"和"w+":文件指针指向开头"a"和"a+":写入时指针在末尾,读取时从开头开始
📋 模式选择指南
| 需求 | 推荐模式 | 说明 |
|---|---|---|
| 只读现有文件 | "r" |
文件必须存在 |
| 创建/覆盖文件 | "w" |
原内容被清空 |
| 追加内容 | "a" |
保留原内容 |
| 读写现有文件 | "r+" |
不能创建新文件 |
| 读写新文件 | "w+" |
会清空内容 |
| 读写追加 | "a+" |
写入在末尾,读取可从任意位置 |
| 二进制数据 | 添加 b 后缀 |
如 "rb", "wb" |
选择正确的文件模式是文件操作成功的关键!