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 才会真正将数据写入磁盘。这解释了为何不关闭文件会导致数据丢失。
相关推荐
JAVA面经实录9176 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
酱学编程10 小时前
【从零到一实现一个 AI Agent 框架 · 第四篇】04. 任务规划:拆解复杂目标 -
服务器·网络·数据库·人工智能
ALex_zry10 小时前
C++26 std::complex 结构化绑定详解:auto [re, im] = c
c语言·开发语言·c++
Zw-awa11 小时前
01-写了include之后到底发生了什么
c语言
艾莉丝努力练剑12 小时前
OpenCode AI 编程:Ubuntu 24.04 环境安装与使用指南
linux·服务器·网络·人工智能·tcp/ip·ubuntu
崇山峻岭之间12 小时前
Keil5输出hex转换为bin的设置
linux·运维·服务器
谷雪_65813 小时前
Linux 网络命名空间:从内核原理到企业级容器网络架构全景实战
linux·网络·架构
Tian_Hang13 小时前
Eclipse Ditto 的权限策略
java·服务器·前端·网络·ide·ubuntu·eclipse
qq_1631357514 小时前
Linux 【03- chgrp命令超详细教程】
linux
CodeStats14 小时前
【编程语言】深度梳理C/C++、Java、Python、Go、Rust的区别
java·linux·c语言·c++·python·rust·go