fopen 是 C 标准库 <stdio.h> 中的一个核心函数,它的全称是 "file open"(文件打开),正如其名,它的主要作用是*打开一个文件,并返回一个指向该文件的文件指针(FILE)**,后续所有的文件操作(如读、写、关闭等)都将通过这个文件指针来进行。

函数原型
#include <stdio.h> FILE *fopen(const char *filename, const char *mode);
参数说明:
-
filename(const char *):- 这是一个字符串,代表你想要打开的文件的路径和名称。
- 它可以是相对路径(
"data.txt","../logs/app.log")或绝对路径("/home/user/myfile.txt")。 - 如果文件不存在,
"w","a","w+","a+"等模式会创建它;而"r","r+"模式则会失败。
-
mode(const char *):- 这是一个字符串,指定了文件打开的模式,即你打算对文件进行什么样的操作(只读、只写、读写等)。
返回值:

- 成功: 返回一个指向
FILE结构体的指针(FILE*),这个指针通常被称为“文件流”或“文件句柄”,后续的fprintf,fscanf,fgets,fputs,fclose等函数都需要它作为参数。 - 失败: 返回
NULL指针,失败的原因通常是文件不存在、没有权限、路径错误等。
文件打开模式 (mode)
这是 fopen 函数最关键的部分,不同的模式决定了文件的访问方式和指针的初始位置。
| 模式 | 含义 | 文件存在时 | 文件不存在时 | 读/写 | 文件指针初始位置 |
|---|---|---|---|---|---|
"r" |
只读 | 打开成功 | 失败 | 只读 | 文件开头 |
"w" |
只写 | 内容被清空 | 创建新文件 | 只写 | 文件开头 |
"a" |
追加 | 在末尾追加内容 | 创建新文件 | 只写 | 文件末尾 |
"r+" |
读写 | 打开成功 | 失败 | 读写 | 文件开头 |
"w+" |
读写 | 内容被清空 | 创建新文件 | 读写 | 文件开头 |
"a+" |
读写 | 在末尾追加内容 | 创建新文件 | 读写 | 文件末尾 |
补充说明:
- 二进制模式: 在上述所有模式后加上字母
"b",就变成了二进制模式。"rb","wb","ab","r+b"等。- 文本模式 (
"r","w"等): 默认模式,在读写时,会进行一些转换,例如在 Windows 系统下,\n会被转换成\r\n写入文件,读取时\r\n会被转换回\n。 - 二进制模式 (
"rb","wb"等): 用于处理非文本文件,如图片、音频、视频、可执行文件等,它不会进行任何字符转换,数据原封不动地读写。处理二进制文件时,必须使用二进制模式。
- 文本模式 (
使用示例
下面通过几个经典的例子来演示 fopen 的用法。
示例 1:写入文件("w" 模式)
这个例子会创建一个名为 output.txt 的文件,并向其中写入一行文本。

#include <stdio.h>
#include <stdlib.h> // 用于 exit()
int main() {
FILE *fp;
char *filename = "output.txt";
// 1. 尝试以"只写"模式打开文件
fp = fopen(filename, "w");
// 2. 检查文件是否成功打开
if (fp == NULL) {
printf("错误:无法打开文件 %s\n", filename);
// 使用 exit(EXIT_FAILURE) 终止程序
exit(EXIT_FAILURE);
}
// 3. 向文件中写入内容
fprintf(fp, "Hello, C Programming!\n");
fprintf(fp, "This is a test for fopen().\n");
// 4. 关闭文件
fclose(fp);
printf("文件 %s 写入成功!\n", filename);
return 0;
}
运行结果:
程序运行后,会在同一目录下生成一个 output.txt 文件,内容如下:
Hello, C Programming!
This is a test for fopen().
示例 2:读取文件("r" 模式)
这个例子会读取上面创建的 output.txt 文件,并将其内容打印到屏幕上。
#include <stdio.h>
#include <stdlib.h>
#define MAX_CHAR 256
int main() {
FILE *fp;
char *filename = "output.txt";
char buffer[MAX_CHAR];
// 1. 尝试以"只读"模式打开文件
fp = fopen(filename, "r");
// 2. 检查文件是否成功打开
if (fp == NULL) {
printf("错误:无法打开文件 %s\n", filename);
exit(EXIT_FAILURE);
}
printf("正在从文件 %s 读取内容:\n", filename);
printf("------------------------\n");
// 3. 从文件中逐行读取内容
// fgets 读取一行,直到遇到换行符或读取到 MAX_CHAR-1 个字符
while (fgets(buffer, MAX_CHAR, fp) != NULL) {
// 打印读取到的内容(fgets 会保留换行符)
printf("%s", buffer);
}
// 4. 关闭文件
fclose(fp);
printf("------------------------\n");
printf("文件读取完毕,\n");
return 0;
}
运行结果:
正在从文件 output.txt 读取内容:
------------------------
Hello, C Programming!
This is a test for fopen().
------------------------
文件读取完毕。
示例 3:追加内容到文件("a" 模式)
这个例子会在 output.txt 文件的末尾追加新的内容,而不会删除原有内容。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char *filename = "output.txt";
// 1. 尝试以"追加"模式打开文件
fp = fopen(filename, "a");
// 2. 检查文件是否成功打开
if (fp == NULL) {
printf("错误:无法打开文件 %s\n", filename);
exit(EXIT_FAILURE);
}
// 3. 在文件末尾追加内容
fprintf(fp, "This line is appended at the end.\n");
// 4. 关闭文件
fclose(fp);
printf("内容已成功追加到文件 %s 中!\n", filename);
return 0;
}
运行结果:
再次打开 output.txt变为:
Hello, C Programming!
This is a test for fopen().
This line is appended at the end.
最佳实践与注意事项
-
始终检查返回值:
fopen可能会因为各种原因失败(文件不存在、权限不足、磁盘已满等)。永远不要假设fopen会成功,每次调用后,都必须检查返回值是否为NULL,这是健壮代码的基本要求。 -
记得关闭文件: 使用完文件后,必须调用
fclose(fp)来关闭它。- 释放资源: 关闭文件会释放操作系统为该文件分配的资源(如文件句柄)。
- 确保数据写入: 对于写操作,调用
fclose或程序正常退出时,所有在缓冲区中的数据才会被真正写入磁盘,如果不关闭,可能会导致数据丢失。 - 防止文件锁定: 在某些系统中,一个打开的文件可能会被锁定,其他进程无法访问,关闭文件可以解除锁定。
-
错误处理: 当
fopen失败时,perror函数是一个非常有用的工具,它会打印出你自定义的错误信息,并附上系统描述的具体原因("No such file or directory")。fp = fopen("non_existent_file.txt", "r"); if (fp == NULL) { perror("fopen failed"); // 会打印类似 "fopen failed: No such file or directory" 的信息 return 1; }
fopen 是 C 语言进行文件 I/O 操作的入口,记住它的核心三要素:
- 功能: 打开文件,返回
FILE*指针。 - 关键参数:
filename(文件名) 和mode(打开模式)。 - 核心原则: 检查返回值,用完即关 (
fclose)。
掌握了 fopen,你就打开了 C 语言文件操作的大门,可以进一步学习 fread, fwrite, fseek, ftell 等更强大的文件操作函数。
