C语言 文件

在C语言中,文件是实现数据持久化的核心手段。程序运行时产生的数据默认存放在内存中,一旦程序结束,这些数据就会丢失。通过文件操作,我们可以将数据保存到硬盘上,以便长期存储和重复使用。

C语言通过标准库 <stdio.h> 中定义的一系列函数和 FILE 结构体来管理文件操作。

📁 核心概念

文件指针 (FILE*)

C语言中的所有文件操作都围绕一个核心概念------文件指针 。它并非直接指向磁盘上的文件,而是一个指向内存中 FILE 结构体的指针。这个 FILE 结构体由操作系统和C标准库维护,充当了程序和文件之间的"代理"或"管理员",其中封装了文件的状态信息,例如:

  • 文件描述符:操作系统用于标识打开文件的整数。
  • 当前文件偏移量:记录了下一次读写操作在文件中的位置。
  • 错误标志和文件结束标志:用于判断操作是否出错或是否已读到文件末尾。
文件类型

C语言主要处理两种类型的文件:

  1. 文本文件 :以ASCII码的形式存储数据,内容是人类可读的字符。例如 .txt, .c 文件。在文本模式下,某些字符(如换行符 \n)可能会被自动转换。
  2. 二进制文件 :将数据在内存中的二进制形式原封不动地写入磁盘。例如 .exe, .jpg 文件。这种方式更节省空间,读写效率也更高,但内容通常不可直接阅读。

🚀 文件操作基本流程

文件操作遵循一个固定的三步流程:打开 → 读写 → 关闭

1. 打开文件 (fopen)

使用 fopen 函数打开文件,它会返回一个 FILE* 指针。如果打开失败,则返回 NULL

c 复制代码
#include <stdio.h>

int main() {
    FILE *fp = fopen("example.txt", "r"); // 以只读模式打开文件
    if (fp == NULL) { // 必须检查是否打开成功
        printf("文件打开失败!\n");
        return 1;
    }
    // ... 进行读写操作 ...
    fclose(fp); // 操作完成后关闭文件
    return 0;
}
2. 读写文件

根据文件类型和需求,有多种读写函数可供选择。

  • 格式化读写 :类似于 printfscanf,用于处理格式化的文本数据。
    • fprintf(fp, "格式字符串", 变量列表);:将格式化数据写入文件。
    • fscanf(fp, "格式字符串", 变量地址列表);:从文件中读取格式化数据。
  • 字符/字符串读写 :用于逐字符或逐行处理文本。
    • fputc(ch, fp); / fgetc(fp);:写入/读取一个字符。
    • fputs(str, fp); / fgets(buf, size, fp);:写入/读取一个字符串。
  • 二进制块读写 :用于高效地读写数组、结构体等二进制数据。
    • fwrite(ptr, size, count, fp);:将内存中的数据块写入文件。
    • fread(ptr, size, count, fp);:从文件中读取数据块到内存。
3. 关闭文件 (fclose)

文件使用完毕后,必须 调用 fclose 函数关闭。这一步至关重要,因为它会:

  • 刷新缓冲区,确保所有暂存在内存中的数据都被写入磁盘。
  • 释放系统分配给该文件的资源。

忽略关闭文件可能导致数据丢失或资源泄漏。

📝 文件打开模式

fopen 函数的第二个参数决定了文件的打开方式。以下是常用的打开模式:

模式 含义 文件不存在 文件已存在
"r" 只读 打开失败 从头开始读取
"w" 只写 创建新文件 清空原有内容,从头写入
"a" 追加 创建新文件 末尾追加内容
"r+" 读写 打开失败 从头开始读写
"w+" 读写 创建新文件 清空原有内容,从头读写
"rb", "wb", "ab" 二进制模式 同上,但针对二进制文件

🎯 其他重要操作

  • 文件定位 :可以随机访问文件中的任意位置。
    • fseek(fp, offset, origin);:将文件位置指针移动到指定位置。origin 可以是文件开头 (SEEK_SET)、当前位置 (SEEK_CUR) 或文件末尾 (SEEK_END)。
    • ftell(fp);:返回当前文件位置指针相对于文件开头的偏移量。
    • rewind(fp);:将文件位置指针重置到文件开头。
  • 错误与状态检测
    • feof(fp);:检查是否读到文件末尾。
    • ferror(fp);:检查文件操作是否发生错误。

⚠️ 关键注意事项

  1. 始终检查返回值 :调用 fopen 后必须检查返回的指针是否为 NULL,以确认文件是否成功打开。
  2. 务必关闭文件 :任何打开的文件都必须配对使用 fclose,这是良好的编程习惯。
  3. 理解缓冲区 :写入文件的数据会先存放到内存缓冲区,fclosefflush 才会真正将数据写入磁盘。这解释了为何不关闭文件会导致数据丢失。
相关推荐
txg6661 小时前
自动驾驶领域热点简报(2026-04-26 ~ 2026-05-03)
linux·人工智能·自动驾驶
二哈赛车手2 小时前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
嵌入式×边缘AI:打怪升级日志2 小时前
嵌入式Linux开发核心自测题(全系列精华浓缩)
java·linux·运维
_codemonster2 小时前
系统分析师刷题系列--操作系统(二)
服务器·系统架构
嵌入式×边缘AI:打怪升级日志2 小时前
TinaSDK Linux Kernel 基本使用(全志T113开发板)
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志2 小时前
Linux内核基础完全入门指南(理论篇)
linux·运维·服务器
Muyuan19982 小时前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
比昨天多敲两行3 小时前
Linux进程概念
linux·运维·服务器
HLC++3 小时前
Linux的基本指令+权限+基础开发工具
linux·运维·服务器