fopen, fopen_s
来自cppreference.com
在标头 <stdio.h> 定义 | ||
(1) | ||
FILE*fopen(constchar*filename, constchar*mode ); | (C99 前) | |
FILE*fopen(constchar*restrict filename, constchar*restrict mode ); | (C99 起) | |
errno_t fopen_s(FILE*restrict*restrict streamptr, constchar*restrict filename, | (2) | (C11 起) |
1) 打开
filename
所指示的文件,并返回指向关联到该文件的文件流的指针。 mode
用于确定文件访问模式。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){constchar* 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 而非 charwhile((c =fgetc(fp))!=EOF)// 标准 C 的 I/O 文件读取循环putchar(c); if(ferror(fp))puts("读取时发生 I/O 错误");elseif(feof(fp)){puts("成功抵达文件末尾"); is_ok =EXIT_SUCCESS;} fclose(fp);remove(fname);return is_ok;}
可能的输出:
Hello, world! 成功抵达文件末尾
[编辑]引用
- 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) | 以不同名称打开既存的文件流 (函数) |
fopen 的 C++ 文档 |