60-c语言文件打开和关闭
在C语言中,文件操作必须严格遵循“打开→读写→关闭”流程:使用
fopen函数以指定模式(如"r"读、"w"写、"a"追加)打开文件并检查返回值(避免空指针),进行读写操作后,必须用fclose函数关闭文件(检查返回值并置指针为NULL),以确保数据安全写入磁盘、释放系统资源并防止野指针问题。
在C语言中,文件操作是程序与外部存储设备进行数据交换的重要手段。文件操作遵循"打开→读写→关闭"的三步流程,其中打开和关闭文件是基础且关键的步骤。
一、文件指针(FILE*)
在缓冲文件系统中,系统会为每个打开的文件分配一块内存区域(文件信息区),用于存储文件名、状态、当前读写位置等关键信息。这个信息区被封装为FILE结构体(定义在<stdio.h>中)。
我们通过FILE*类型的指针来操作这个结构体,这个指针就是文件指针:
#include <stdio.h>
FILE *fp; // 定义一个文件指针变量
二、文件打开:fopen函数
函数原型
FILE *fopen(const char *filename, const char *mode);
参数说明
filename:要打开的文件名(可带路径)mode:文件打开模式,决定文件的操作权限
返回值
- 打开成功:返回指向文件信息区的指针(非NULL)
- 打开失败:返回NULL指针(必须进行错误检查)
常用文件打开模式
| 模式 | 含义 | 文件不存在时 | 文件存在时 |
|---|---|---|---|
| "r" | 只读打开文本文件 | 打开失败 | 从文件开头读取 |
| "w" | 只写打开文本文件 | 创建新文件 | 清空文件内容后写入 |
| "a" | 追加打开文本文件 | 创建新文件 | 在文件末尾追加内容 |
| "rb" | 只读打开二进制文件 | 打开失败 | 从文件开头读取 |
| "wb" | 只写打开二进制文件 | 创建新文件 | 清空文件内容后写入 |
| "r+" | 读写打开文本文件 | 打开失败 | 从文件开头读写 |
| "w+" | 读写打开文本文件 | 创建新文件 | 清空文件内容后读写 |
| "a+" | 读写打开文本文件 | 创建新文件 | 在文件末尾读写 |
注意:二进制模式(如"rb"、"wb")在处理非文本文件(如图片、音频、结构体数据)时必须使用,以确保文件内容在读写过程中不被系统做任何"智能"转换。
打开文件示例
FILE *fp;
// 打开文件进行读操作
fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
// 错误处理
}
三、文件关闭:fclose函数
函数原型
int fclose(FILE *stream);
参数说明
stream:要关闭的文件指针
返回值
- 正常关闭:返回0
- 关闭失败:返回非0值(通常为EOF)
关闭文件的重要性
- 确保所有在缓冲区的数据被真正写入磁盘
- 释放系统资源,避免内存泄漏
- 关闭后应将文件指针置为NULL,避免成为野指针
关闭文件示例
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败!\n");
// 错误处理
}
fp = NULL; // 避免成为野指针
四、文件操作流程
C语言文件操作必须遵循以下标准流程:
- 打开文件:使用
fopen函数,获取文件指针 - 文件读写:使用相关函数(如
fgetc、fputc、fread、fwrite等)进行操作 - 关闭文件:使用
fclose函数,确保数据写入磁盘并释放资源
#include <stdio.h>
int main() {
FILE *fp;
// 1. 打开文件
fp = fopen("data.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return 1;
}
// 2. 文件读写操作
fprintf(fp, "Hello, File I/O!\n");
// 3. 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败!\n");
return 1;
}
fp = NULL;
return 0;
}
五、重要注意事项
- 必须检查fopen返回值:打开文件失败时,不要继续操作,否则可能导致程序崩溃
- 每次打开都要关闭:避免资源泄漏,特别是在长时间运行的程序中
- 关闭后置NULL:防止文件指针成为野指针
- 二进制模式使用:处理非文本文件时,必须使用二进制模式(如"rb"、"wb")
- 路径规范:在Windows系统中,路径分隔符使用反斜杠(如"C:\file.txt")或正斜杠(如"C:/file.txt")
通过正确使用文件打开和关闭操作,可以确保程序与外部存储设备之间的数据交换安全、可靠。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

