核心概念:文件指针 (FILE Pointer)
在 C 语言中,所有文件操作都是通过一个指向 FILE 结构体的指针来完成的,你可以把这个 FILE 指针想象成一个“遥控器”,你通过这个遥控器来对文件进行各种操作(打开、读取、写入、关闭等)。

(图片来源网络,侵删)
FILE 结构体在 <stdio.h> 中被定义,但我们通常不需要关心它的具体内部细节,只需要知道如何使用 FILE* 类型的指针即可。
打开文件:fopen() 函数
要操作文件,首先必须用 fopen() 函数将其打开。
函数原型:
FILE *fopen(const char *filename, const char *mode);
参数:

(图片来源网络,侵删)
filename: 字符串,表示你要打开的文件名,可以是文件名(如data.txt),也可以包含路径(如C:/projects/data.txt或/home/user/data.txt)。注意:在 Windows 中路径分隔符用反斜杠\,但在 C 字符串中\是转义字符,所以需要写成\\或者使用正斜杠 。mode: 字符串,指定文件的打开模式,以下是几种最常用的模式:
| 模式 | 含义 | 如果文件不存在 | 如果文件存在 |
|---|---|---|---|
"r" |
只读 | 失败,返回 NULL | 打开,文件指针指向开头 |
"w" |
只写 | 创建新文件 | 清空文件内容,文件指针指向开头 |
"a" |
追加 | 创建新文件 | 打开,文件指针指向末尾 |
"r+" |
读写 | 失败,返回 NULL | 打开,文件指针指向开头 |
"w+" |
读写 | 创建新文件 | 清空文件内容,文件指针指向开头 |
"a+" |
读写 | 创建新文件 | 打开,文件指针指向末尾 |
返回值:
- 成功:返回一个指向
FILE结构体的指针。 - 失败:返回
NULL,失败的原因可能是文件不存在、路径错误、没有权限等。
重要提示: 每次使用 fopen() 后,都应该立即检查返回值是否为 NULL,以确保文件成功打开。
写入文件:fprintf() 和 fputs()
文件打开后,就可以向其中写入数据了。
fprintf() 函数
fprintf() 的作用和 printf() 非常相似,只是 printf() 是将数据输出到控制台,而 fprintf() 是将数据格式化输出到文件。

(图片来源网络,侵删)
函数原型:
int fprintf(FILE *stream, const char *format, ...);
stream: 文件指针(即fopen()的返回值)。format: 格式化字符串,和printf()一样。- 可变参数,要写入的数据。
fputs() 函数
fputs() 用于向文件写入一个字符串。
函数原型:
int fputs(const char *str, FILE *stream);
str: 要写入的字符串。stream: 文件指针。
关闭文件:fclose() 函数
当你完成所有文件操作后,必须使用 fclose() 函数关闭文件,这是一个非常重要的步骤!
为什么必须关闭?
- 释放资源:操作系统为每个打开的文件分配资源(如缓冲区),关闭文件会释放这些资源。
- 确保数据写入:当你写入数据时,数据通常先被存储在内存缓冲区中,
fclose()会确保所有缓冲区中的数据都被真正写入到磁盘文件中,如果程序异常终止而没有关闭文件,可能会导致数据丢失。
函数原型:
int fclose(FILE *stream);
stream: 要关闭的文件指针。
完整示例:创建并写入文件
下面是一个完整的 C 语言程序,它创建一个名为 mylog.txt 的文件,并向其中写入一些内容。
#include <stdio.h>
#include <stdlib.h> // 用于 exit() 函数
int main() {
// 1. 定义一个文件指针
FILE *fp;
// 2. 使用 fopen() 以 "只写" 模式打开文件
// 如果文件不存在,fopen 会自动创建它
fp = fopen("mylog.txt", "w");
// 3. 检查文件是否成功打开
if (fp == NULL) {
printf("无法创建或打开文件 mylog.txt\n");
// 如果打开失败,直接退出程序
exit(1);
}
printf("文件 mylog.txt 创建/打开成功!\n");
// 4. 使用 fprintf() 向文件写入格式化数据
fprintf(fp, "这是一行日志信息,\n");
fprintf(fp, "当前系统时间: %s\n", __DATE__); // __DATE__ 是一个预定义宏,表示当前日期
// 5. 使用 fputs() 向文件写入一个字符串
fputs("这是另一行使用 fputs 写入的文本,\n", fp);
// 6. 关闭文件
fclose(fp);
printf("数据已成功写入文件,并已关闭文件,\n");
return 0;
}
如何编译和运行:
- 将以上代码保存为
create_file.c。 - 打开终端或命令提示符,使用 gcc 进行编译:
gcc create_file.c -o create_file
- 运行生成的可执行文件:
./create_file
- 程序运行后,你会发现当前目录下多了一个名为
mylog.txt的文件,用文本编辑器打开它,内容会是:这是一行日志信息。 当前系统时间: Oct 26 2025 这是另一行使用 fputs 写入的文本。
进阶:追加内容到文件
如果你想向一个已存在的文件末尾添加内容,而不是覆盖它,应该使用 "a" (append) 模式。
示例代码:
#include <stdio.h>
int main() {
FILE *fp;
// 以 "追加" 模式打开文件
// 如果文件不存在,会创建;如果存在,会在末尾追加
fp = fopen("mylog.txt", "a");
if (fp == NULL) {
printf("无法打开文件 mylog.txt 进行追加,\n");
return 1;
}
// 向文件追加新内容
fprintf(fp, "这条信息是在文件末尾追加的,\n");
// 关闭文件
fclose(fp);
printf("内容已成功追加到 mylog.txt,\n");
return 0;
}
再次运行这个程序后,mylog.txt 的内容会变成:
这是一行日志信息。
当前系统时间: Oct 26 2025
这是另一行使用 fputs 写入的文本。
这条信息是在文件末尾追加的。
| 步骤 | 函数 | 作用 | 示例 |
|---|---|---|---|
| 打开 | fopen() |
获取文件操作权限,创建或打开文件 | FILE *fp = fopen("data.txt", "w"); |
| 检查 | if (fp == NULL) |
确保文件操作成功 | if (fp == NULL) { /* 处理错误 */ } |
| 写入 | fprintf(), fputs() |
向文件写入数据 | fprintf(fp, "Hello"); |
| 关闭 | fclose() |
释放资源,确保数据写入磁盘 | fclose(fp); |
这就是在 C 语言中创建和写入文件的基本流程,掌握了这些,你就可以开始进行文件 I/O 操作了。
