/*********************************************
* @brief 打开文件
* @param filename 文件路径
* @param mode 打开模式
* @return 文件流的指针
********************************************/
FILE* fopen(const char* restrict filename, const char* restrict mode);
!subtitle:说明
打开文件。返回的文件指针需要使用 fclose 函数进行关闭。
!subtitle:参数
filename - 文件路径
mode - 文件的访问模式
!subtitle:返回值
打开的文件流指针
失败时返回 NULL
| 模式说明符 | 标准 | 意义 | 说明 | 操作权限 | 如果文件存在 | 如果文件不存在 |
|---|---|---|---|---|---|---|
"r" |
C89 | 读模式 | 打开文件进行读取 | 读 | 从文件开头进行操作 | 打开失败 |
"w" |
C89 | 写模式 | 创建用于写入的文件 | 写 | 清空原文件 | 新建文件 |
"a" |
C89 | 追加模式 | 追加写入文件 | 写 | 从文件末尾进行操作 | 新建文件 |
| 补充说明符 | 标准 | 意义 | 说明 | 操作权限 | 示例 |
|---|---|---|---|---|---|
"+" |
C89 | 扩展模式 | 文件既可读也可写 | 可读可写 | "r+" "w+" "a+" |
"b" |
C89 | 二进制模式 | 以二进制模式打开文件 | "rb" "wb" "ab" "w+b" |
|
"x" |
C11 | 独占模式 | 文件已存在时强制失败 | "wx" "w+x" "w+bx" |
文本模式下(即不含 "b"),读写文件时会跳过不可打印字符,参考 isprint。但在类 POSIX 系统上无效,类 POSIX 系统始终以二进制模式打开
追加模式("a")下,无论文件位置指示器的当前位置如何,进行写操作时都会向文件末尾写入。
扩展模式("+")下,文件既可读也可写,但进行写入后需要调用 fflush、fseek 才能进行读操作,进行读取后需要调用 fseek 后才能进行写操作。
#include <stdio.h>
int main(void)
{
// 打开文件
FILE* fp = fopen("/tmp/test.txt", "w+");
if (fp == NULL)
{
perror("文件打开失败");
return 1;
}
// 写文件
fputs("Hello World\n", fp);
// 重置文件位置指示器到文件开头
fseek(fp, 0, SEEK_SET);
// 读取文件并打印
int ch;
while ((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
// 关闭文件
fclose(fp);
return 0;
}
运行结果:
Hello World
C17 standard (ISO/IEC 9899:2018):
7.21.5.3 The fopen function (p: 223-224)
C11 standard (ISO/IEC 9899:2011):
7.21.5.3 The fopen function (p: 305-306)
C99 standard (ISO/IEC 9899:1999):
7.19.5.3 The fopen function (p: 271-272)
C89/C90 standard (ISO/IEC 9899:1990):
4.9.5.3 The fopen function