C语言文件操作中的读写模式

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"

选择正确的文件模式是文件操作成功的关键!

相关推荐
量子炒饭大师1 小时前
初探算法的魅力——【暴力枚举】
c语言·数据结构·c++·算法·动态规划
枫叶丹41 小时前
【Qt开发】Qt窗口(六) -> QMessageBox 消息对话框
c语言·开发语言·数据库·c++·qt·microsoft
缘三水1 小时前
【C语言】11.指针(1)
c语言·开发语言·指针
Miuney_MAX1 小时前
【电子电路】之Type-C正反插
c语言·开发语言
hefaxiang10 小时前
C语言常见概念(下)
c语言·开发语言
potato_may10 小时前
链式二叉树 —— 用指针构建的树形世界
c语言·数据结构·算法·链表·二叉树
Bona Sun11 小时前
单片机手搓掌上游戏机(二十)—pico运行doom之编译环境
c语言·c++·单片机·游戏机
我真不会起名字啊12 小时前
C、C++中的sprintf和stringstream的使用
java·c语言·c++
剪一朵云爱着14 小时前
PAT 1164 Good in C
c语言·开发语言