核心头文件:#include <stdio.h>
fopen 函数是 C 标准输入输出库(Standard Input/Output Library)的一部分,要使用这个库中的任何函数,你都必须在程序的开头包含相应的头文件。

(图片来源网络,侵删)
对于 fopen,你需要包含的是 <stdio.h>。
为什么需要它?
- 函数声明:
fopen是一个库函数,而不是 C 语言的关键字,编译器需要提前知道这个函数的“签名”(即它的返回类型、函数名和参数类型),才能正确地调用它。#include <stdio.h>会把fopen的声明(通常是FILE *fopen(const char *filename, const char *mode);)告诉编译器。 - 类型定义:
fopen函数返回一个指向FILE类型的指针。FILE这个结构体类型也是在<stdio.h>中定义的,它包含了管理文件流(如文件描述符、当前位置、错误标志等)所需的所有信息,没有这个定义,你就无法正确地使用FILE*这个返回值。
示例代码:
#include <stdio.h> // 必须包含这个头文件才能使用 fopen
int main() {
// ... 其他代码 ...
return 0;
}
fopen 函数详解
fopen 函数用于打开一个文件,并返回一个指向该文件的 FILE 对象(指针)。

(图片来源网络,侵删)
函数原型
FILE *fopen(const char *filename, const char *mode);
参数
-
const char *filename:指向字符串的指针,字符串包含你想要打开的文件名。- 可以是相对路径(如
"data.txt","../logs/info.log")。 - 也可以是绝对路径(如
"/home/user/myfile.txt","C:\\projects\\data.csv")。 - 如果文件不存在,某些打开模式会自动创建它。
- 可以是相对路径(如
-
const char *mode:指向字符串的指针,字符串指定了文件的打开模式,这是最关键的部分。
常用的文件打开模式
| 模式 | 含义 | 如果文件不存在 | 如果文件存在 | 文件读写位置 |
|---|---|---|---|---|
"r" |
只读 | 失败 (返回 NULL) |
打开成功 | 文件开头 |
"w" |
只写 | 创建新文件 | 文件开头 | |
"a" |
追加 | 创建新文件 | 打开成功 | 文件末尾 |
"r+" |
读写 | 失败 (返回 NULL) |
打开成功 | 文件开头 |
"w+" |
读写 | 创建新文件 | 文件开头 | |
"a+" |
读写 | 创建新文件 | 打开成功 | 文件末尾 |
补充说明:
- 二进制模式:在上述模式字符串末尾加上
"b",可以以二进制模式打开文件,这对于处理非文本文件(如图片、音频、可执行文件)非常重要。"rb"(二进制只读),"wb"(二进制只写),"ab"(二进制追加),"r+b"(二进制读写)。
"x"模式 (C11 新增):这是一个独占创建模式,它要求文件必须不存在,如果文件已存在,则打开失败。"wx"(独占创建只写)。
返回值
- 成功:返回一个指向
FILE结构体的指针,你需要用FILE*类型的变量来接收这个返回值,后续的所有文件操作(如fscanf,fprintf,fread,fwrite,fclose)都通过这个指针进行。 - 失败:返回
NULL(空指针),失败的原因可能是文件不存在、路径错误、没有打开文件的权限等。
完整示例与最佳实践
一个健壮的文件操作程序必须检查 fopen 的返回值是否为 NULL,以防止因打开失败而导致程序崩溃。
示例1:写入文件 ("w" 模式)
这个例子会创建一个名为 output.txt 的文件,并写入 "Hello, World!"。
#include <stdio.h>
#include <stdlib.h> // 用于 exit 函数
int main() {
// 1. 声明一个 FILE 指针
FILE *fp;
// 2. 尝试以只写模式 ("w") 打开文件
// 注意:这里一定要检查返回值!
fp = fopen("output.txt", "w");
// 3. 检查文件是否成功打开
if (fp == NULL) {
// 如果打开失败,打印错误信息到标准错误流
perror("Error opening file for writing");
// 并以非零状态码退出程序
exit(EXIT_FAILURE);
}
// 4. 向文件中写入文本
fprintf(fp, "Hello, World!\n");
fprintf(fp, "This is a test of the fopen function.\n");
// 5. 关闭文件!非常重要!
fclose(fp);
printf("File 'output.txt' written successfully.\n");
return 0;
}
运行后:
程序目录下会生成一个 output.txt 文件,内容如下:
Hello, World!
This is a test of the fopen function.
示例2:读取文件 ("r" 模式)
这个例子会读取上面创建的 output.txt 文件。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char buffer[256]; // 用于存储读取的行
// 尝试以只读模式 ("r") 打开文件
fp = fopen("output.txt", "r");
// 检查文件是否成功打开
if (fp == NULL) {
perror("Error opening file for reading");
exit(EXIT_FAILURE);
}
// 使用 fgets 逐行读取文件内容
printf("Reading from 'output.txt':\n");
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
// fgets 会读取换行符,所以直接打印即可
printf("%s", buffer);
}
// 关闭文件
fclose(fp);
return 0;
}
运行后:
Reading from 'output.txt':
Hello, World!
This is a test of the fopen function.
- 必须包含:使用
fopen之前,必须在代码开头写上#include <stdio.h>。 - 检查返回值:
fopen可能会失败,返回NULL,永远不要忽略这个返回值,必须进行判断,否则后续操作会导致程序崩溃(段错误)。 - 选择正确的模式:根据你的需求(读、写、追加、是否创建)选择合适的文件打开模式。
- 关闭文件:文件操作完成后,一定要调用
fclose(fp)来关闭文件,释放系统资源,并确保所有缓冲区的数据都被写入磁盘。
