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
,并且以下错误在运行时被检测到并调用当前安装的 约束处理程序 函数-
streamptr
是一个空指针 -
filename
是一个空指针 -
mode
是一个空指针
-
fopen_s
只有在实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时才保证可用。内容 |
[编辑] 参数
filename | - | 要将文件流关联到的文件名 |
mode | - | 确定 文件访问模式 的空终止字符字符串 |
streamptr | - | 指向函数存储结果的指针(输出参数)的指针 |
[编辑] 文件访问标志
文件访问 mode 字符串 |
含义 | 解释 | 如果文件 已存在 |
如果文件 不存在 |
---|---|---|---|---|
"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` 本身为空指针)。
[edit] 注释
`filename` 的格式由实现定义,不一定是指向文件(例如,它可能是控制台或通过文件系统 API 访问的另一个设备)。在支持它们的平台上,`filename` 可能包含绝对或相对文件系统路径。
[edit] 示例
运行此代码
#include <stdio.h> #include <stdlib.h> int main(void) { const char* fname = "/tmp/unique_name.txt"; // or 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; // note: int, not char, required to handle EOF while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop 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
[edit] 参考
- C17 标准 (ISO/IEC 9899:2018)
- 7.21.5.3 fopen 函数 (p: 223-224)
- K.3.5.2.1 fopen_s 函数 (p: 428-429)
- C11 标准 (ISO/IEC 9899:2011)
- 7.21.5.3 fopen 函数 (p: 305-306)
- K.3.5.2.1 fopen_s 函数 (p: 588-590)
- C99 标准 (ISO/IEC 9899:1999)
- 7.19.5.3 fopen 函数 (p: 271-272)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.9.5.3 fopen 函数
[edit] 参见
关闭文件 (函数) | |
将输出流与实际文件同步 (函数) | |
(C11) |
使用不同的名称打开现有流 (函数) |
C++ 文档 针对 fopen
|