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"

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

相关推荐
I'mChloe18 小时前
PTO-ISA 深度解析:PyPTO 范式生成的底层指令集与 NPU 算子执行的硬件映射
c语言·开发语言
2的n次方_18 小时前
Runtime 内存管理深化:推理批处理下的内存复用与生命周期精细控制
c语言·网络·架构
嵌入小生00718 小时前
标准IO---核心函数接口延续(嵌入式Linux)
c语言·vscode·vim·嵌入式·小白·标准io·函数接口
历程里程碑19 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
智者知已应修善业21 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
小龙报1 天前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
小武编程1 天前
基于JL700N可视化SDK的MAC地址应用
c语言·tws耳机·杰理jl700n
凉、介1 天前
VMware 三种网络模式(桥接 / NAT / Host-Only)原理与实验解析
c语言·网络·笔记·操作系统·嵌入式·vmware
wangjialelele1 天前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
森焱森1 天前
嵌入式硬件工程师应知 白银快速分析报告
linux·c语言·arm开发·嵌入式硬件·去中心化