fopen, fopen_s
来自 cppreference.cn
定义于头文件 <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
可用。目录 |
[编辑] 参数
filename | - | 要将文件流关联到的文件名 |
mode | - | 确定文件访问模式的以 null 结尾的字符串 |
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"; // 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
[编辑] 参考
- 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 函数
[编辑] 另请参阅
关闭文件 (function) | |
将输出流与实际文件同步 (function) | |
(C11) |
用不同的名称打开一个现有流 (function) |
C++ 文档 for fopen
|