核心答案
fopen 函数定义在 <stdio.h> 头文件中。

(图片来源网络,侵删)
详细解释
为什么是 <stdio.h>?
fopen 是 C 标准库中用于文件操作的核心函数之一,它的全称是 "file open"(文件打开)。fopen 的主要功能是:
- 根据你提供的文件名和打开模式(如 "读取"、"写入" 等),请求操作系统打开一个文件。
- 如果成功,它会返回一个指向
FILE结构体的指针,这个FILE结构体包含了管理该文件流(如文件描述符、当前读写位置、缓冲区状态等)所需的所有信息。 - 如果失败,它会返回
NULL指针。
所有这些与标准输入/输出/流式文件操作相关的函数、宏和类型定义,都被统一包含在 <stdio.h> (Standard Input/Output Header) 这个头文件中。
<stdio.h> 是 C 语言中所有“流”式输入输出操作的大本营。
<stdio.h> 中还包含哪些与文件相关的函数?
既然 fopen 在 <stdio.h> 中,那么它最常用的“小伙伴们”也都在这里,一个典型的文件操作流程会用到以下这些函数,它们都来自同一个头文件:

(图片来源网络,侵删)
| 函数名 | 功能 | 示例 |
|---|---|---|
fopen() |
打开文件,返回 FILE* 指针 |
FILE *fp = fopen("data.txt", "r"); |
fclose() |
关闭文件,释放资源 | fclose(fp); |
fgetc() |
从文件中读取一个字符 | char c = fgetc(fp); |
fputc() |
向文件中写入一个字符 | fputc('A', fp); |
fgets() |
从文件中读取一行字符串 | char buffer[100]; fgets(buffer, 100, fp); |
fputs() |
向文件中写入一个字符串 | fputs("Hello, World!", fp); |
fscanf() |
从文件中格式化读取数据 | fscanf(fp, "%d %s", &age, name); |
fprintf() |
向文件中格式化写入数据 | fprintf(fp, "Name: %s, Age: %d\n", name, age); |
fread() |
二进制读取一块数据到缓冲区 | fread(buffer, sizeof(int), 10, fp); |
fwrite() |
二进制写入一块数据到文件 | fwrite(buffer, sizeof(int), 10, fp); |
fseek() |
移动文件指针到指定位置 | fseek(fp, 0, SEEK_SET); // 移动到文件开头 |
ftell() |
获取文件指针的当前位置 | long pos = ftell(fp); |
rewind() |
将文件指针重置到文件开头 | rewind(fp); |
feof() |
检查是否到达文件末尾 | if (feof(fp)) { ... } |
ferror() |
检查文件操作中是否发生错误 | if (ferror(fp)) { ... } |
如何正确使用 fopen(代码示例)
下面是一个完整的示例,展示了如何包含头文件、使用 fopen 写入和读取一个文本文件。
#include <stdio.h> // 1. 包含 stdio.h 头文件
#include <stdlib.h> // 用于 exit() 函数
int main() {
// --- 1. 写入文件 ---
FILE *write_ptr; // 声明一个 FILE 指针
char *filename = "my_test_file.txt";
// 以写入模式 ("w") 打开文件
// "w" 模式:如果文件存在则覆盖,如果不存在则创建
write_ptr = fopen(filename, "w");
// 检查文件是否成功打开
if (write_ptr == NULL) {
printf("无法打开文件 %s 进行写入!\n", filename);
return 1; // 返回非零表示错误
}
// 向文件中写入内容
fprintf(write_ptr, "你好,世界!\n");
fprintf(write_ptr, "This is a test file.\n");
fprintf(write_ptr, "The number is: %d\n", 2025);
// 关闭文件,非常重要!
fclose(write_ptr);
printf("文件 %s 写入成功!\n\n", filename);
// --- 2. 读取文件 ---
FILE *read_ptr;
char buffer[256]; // 用于存储读取的行
// 以读取模式 ("r") 打开文件
// "r" 模式:要求文件必须已经存在
read_ptr = fopen(filename, "r");
// 检查文件是否成功打开
if (read_ptr == NULL) {
printf("无法打开文件 %s 进行读取!\n", filename);
return 1;
}
printf("开始读取文件内容:\n");
// fgets 读取一行,直到遇到换行符或文件结尾
while (fgets(buffer, sizeof(buffer), read_ptr) != NULL) {
// 打印读取到的一行
printf("%s", buffer);
}
// 关闭文件
fclose(read_ptr);
printf("\n文件读取完毕!\n");
return 0; // 返回 0 表示程序成功执行
}
fopen 的打开模式
fopen 的第二个参数是打开模式,它决定了你如何与文件交互:
| 模式 | 含义 | 如果文件已存在 | 如果文件不存在 |
|---|---|---|---|
"r" |
只读 | 打开成功 | 失败 |
"w" |
只写 | 覆盖 | 创建新文件 |
"a" |
追加 | 在末尾写入 | 创建新文件 |
"r+" |
读写 | 打开成功 | 失败 |
"w+" |
读写 | 覆盖 | 创建新文件 |
"a+" |
读写 | 在末尾读写 | 创建新文件 |
还可以加上 "b" 来表示以二进制模式打开文件,"rb", "wb", "ab" 等,这在处理非文本文件(如图片、音频、可执行文件)时非常重要。
| 问题 | 答案 |
|---|---|
fopen 的头文件是什么? |
<stdio.h> |
| 为什么是这个头文件? | 因为 <stdio.h> 是 C 标准输入/输出库的头文件,包含了所有文件流操作相关的函数和类型。 |
使用 fopen 的第一步是什么? |
在代码文件顶部包含 #include <stdio.h>。 |
使用 fopen 后必须做什么? |
检查返回值是否为 NULL,并在操作完成后调用 fclose() 关闭文件。 |
