fopen, fopen_s
来自cppreference.com
在标头 <stdio.h> 定义
|
||
(1) | ||
FILE *fopen( const char *filename, const char *mode ); |
(C99 前) | |
FILE *fopen( const char *restrict filename, const char *restrict mode ); |
(C99 起) | |
errno_t fopen_s( FILE *restrict *restrict streamptr, const char *restrict filename, |
(2) | (C11 起) |
1) 打开
filename
所指示的文件,并返回指向关联到该文件的文件流的指针。 mode
用于确定文件访问模式。2) 同(1),除了指向文件流的指针被写入
streamptr
,还{{c/bound_check/error_list
-
streamptr
是空指针 -
filename
是空指针 -
mode
是空指针}}
-
fopen_s
,仅若实现定义 __STDC_LIB_EXT1__ 且用户在包含 <stdio.h> 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。参数
filename | - | 关联到文件系统的文件名 |
mode | - | 确定访问模式的空终止字符串文件访问模式 |
streamptr | - | 指向存储函数结果的指针的指针(输出参数) |
文件访问标记
文件访问 模式字符串 |
含义 | 解释 | 若文件已存在的动作 | 若文件不存在的动作 |
---|---|---|---|---|
"r" | 读 | 打开文件以读取 | 从头读 | 打开失败 |
"w" | 写 | 创建文件以写入 | 销毁内容 | 创建新文件 |
"a" | 后附 | 后附到文件 | 写到结尾 | 创建新文件 |
"r+" | 读扩展 | 打开文件以读/写 | 从头读 | 错误 |
"w+" | 写扩展 | 创建文件以读/写 | 销毁内容 | 创建新文件 |
"a+" | 后附扩展 | 打开文件以读/写 | 写到结尾 | 创建新文件 |
可以可选地指定文件访问模式标记 "b" 来以二进制模式打开文件。此标在 POSIX 上没有效果,而在 Windows 系统上,它禁用了对 '\n' 和 '\x1A' 特殊处理。 在附加文件访问模式下,数据被写入到文件尾,而不考虑文件位置指示器的当前位置。 | ||||
如果模式不是以上所列字符串之一,则其行为未定义。一些实现会定义额外支持的模式(比如 Windows)。 | ||||
在更新模式('+')中,输入和输出均可进行,然而输出不应直接紧随输入,而中间无对 fflush、fseek、fsetpos 或 rewind 的调用,且输入不应直接紧随输出,而中间无对 fseek、fsetpos 或 rewind 的调用,除非输入操作遇到文件尾。在更新模式中,允许各实现在即便指定了文本模式时仍使用二进制模式。 | ||||
文件访问模式标记 "x" 可以可选地后附于 "w" 或 "w+" 指定符。若文件存在,则此标记强制函数失败,而不重写它。(C11) | ||||
使用 fopen_s 或 freopen_s 时,任何以 "w" 或 "a" 创建的文件的文件访问许可均禁止其他用户访问它。文件访问模式标签 "u" 可以可选地前附于任何以 "w" 或 "a" 开始的指定符,以启用默认的 fopen 许可。(C11)
|
返回值
2) 若成功,则返回零并将新文件流指针写入 *streamptr 。错误时,返回非零错误码并将空指针写入 *streamptr (除非
streamptr
自身也是空指针)。注意
filename
的格式是实现定义的,而且不需要表示一个文件(譬如可以是控制台或另一能通过文件系统 API 访问的设备)。在支持的平台上, filename
可以包含绝对或相对路径。
示例
运行此代码
#include <stdio.h> #include <stdlib.h> int main(void) { const char* fname = "/tmp/unique_name.txt"; // 或 tmpnam(NULL); int is_ok = EXIT_FAILURE; FILE* fp = fopen(fname, "w+"); if (!fp) { perror("File opening failed"); return is_ok; } fputs("Hello, world!\n", fp); rewind(fp); int c; // 注意:为处理 EOF 需要 int 而非 char while ((c = fgetc(fp)) != EOF) // 标准 C 的 I/O 文件读取循环 putchar(c); if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) { puts("End of file is reached successfully"); is_ok = EXIT_SUCCESS; } fclose(fp); remove(fname); return is_ok; }
可能的输出:
Hello, world! End of file is reached successfully
引用
- C17 标准(ISO/IEC 9899:2018):
- 7.21.5.3 The fopen function (第 223-224 页)
- K.3.5.2.1 The fopen_s function (第 428-429 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.21.5.3 The fopen function (第 305-306 页)
- K.3.5.2.1 The fopen_s function (第 588-590 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.19.5.3 The fopen function (第 271-272 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.9.5.3 The fopen function
参阅
关闭文件 (函数) | |
将输出流与实际文件同步 (函数) | |
(C11) |
以不同名称打开既存的文件流 (函数) |