#C 语言标准库函数 fopen
/*********************************************
* @brief 打开文件
* @param filename 文件路径
* @param mode 打开模式
* @return 文件流的指针
********************************************/
FILE* fopen(const char* restrict filename, const char* restrict mode);
说明
打开文件。返回的文件指针需要使用 fclose 函数进行关闭。
参数
filename
- 文件路径mode
- 文件的访问模式
返回值
- 打开的文件流指针
- 失败时返回
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
#推荐阅读
- C 语言标准库函数 fclose
- C 语言标准库函数 fflush
- C 语言标准库函数 freopen
- C 语言标准库函数 tmpfile
- fopen - cppreference
- fopen - POSIX
- open - Linux manual page
#参考标准
- 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