fopen , fopen64, freopen , freopen64, fopen_s 或 fdopen 子例程
用途
打开流并处理运行时约束违例。
库
标准 C 库 (libc.a)
语法
#define STDC_WANT_LIB_EXT1 1
FILE *fopen ( Path, Type)
const char *Path, *Type;
FILE *fopen64 ( Path, Type)
char *Path, *Type;
FILE *freopen (Path, Type, Stream)
const char *Path, *Type;
FILE *Stream;
FILE *freopen64 (Path, Type, Stream)
char *Path, *Type;
FILE *Stream;
FILE *fdopen ( FileDescriptor, Type)
int FileDescriptor;
const char *Type;
errno_t fopen_s ( 斯特赖安普特尔, 文件名, 模式)
文件 **斯特赖安普特尔 ;
Const char * 文件名 ;
Const char * 模式 ;
描述
福通 和 fopen64 子例程打开由 路径 参数指定的文件并将流与该文件关联,然后返回指向此流的 文件 结构的指针。
打开文件以进行更新时,您可以对生成的流执行输入和输出操作。 但是,如果没有中间的 弗卢什 子例程调用或文件定位操作 (Fseek, 菲塞科, fseeko64, 费特波斯, fsetpos64 或 倒带 子例程) ,那么输出操作不能直接后跟输入操作。 此外,除非输入操作迂到文件的结尾,否则输入操作不能直接跟在输出操作后面而不需要执行中间的刷新或文件定位操作。
打开要附加的文件时 (即,当 类型 参数设置为 A时) ,无法覆盖该文件中已存在的信息。
如果两个单独的进程打开同一个文件进行追加,那么每个进程都可以自由写入文件,而不会破坏另一个进程正在写入的输出。 这两个进程的输出按将其写入文件的顺序混合。
自由 和 freopen64 子例程首先尝试清空该流并关闭与 流 参数关联的任何文件描述符。 忽略未能清空流或关闭文件描述符的情况。
自由 和 freopen64 子例程将指定的文件替换为打开的流. 无论后续打开是否成功,都将关闭原始流。 自由 和 freopen64 子例程返回一个指向与 流 参数关联的 文件 结构的指针。 自由 和 freopen64 子例程通常用于将与标准输入 (斯丁) ,标准输出 (标准输出) 和标准错误 (斯特德尔) 流关联的预先打开的流附加到其他文件。
弗德开放 子例程将流与从 奥佩克斯 子例程, 重复 子例程, 克里特 子例程或 管道 子例程获取的文件描述符相关联。 这些子例程将打开文件,但不会返回指向 文件 结构的指针。 许多标准 I/O 包子例程需要指向 文件 结构的指针。
弗德开放 子例程的 类型 参数指定流的方式,例如 R 打开文件以进行读取,或者 A 打开文件以进行追加 (在文件末尾写入)。 通过 弗德开放 子例程指定的 类型 参数的方式值必须与最初打开或创建文件时指定的文件方式一致。
在类型为 off_t 的对象中可以正确表示的最大值将被确定为打开文件描述中的最大偏移量。
福彭斯 子例程通过使用 文件名 参数指向的字符串的名称来打开文件,并将流与文件关联。
打开文件以使用互斥 (也称为非共享) 访问权进行写入。 如果创建了文件,并且 模式 参数的第一个字符不是 乌,并且如果底层系统支持互斥方式概念,那么该文件具有阻止系统上其他用户访问该文件的许可权。
如果创建了文件并且 模式 参数的第一个字符为 乌,那么该文件将保留系统缺省文件访问许可权,直到该文件关闭为止。
如果成功打开该文件,那么指向 斯特赖安普特尔 参数所指向的 文件 结构的指针将设置为指向控制打开的文件的对象的指针。 否则,指向 斯特赖安普特尔 参数所指向的 文件 结构的指针将设置为空指针,并且该文件将保留系统缺省文件访问许可权,直至关闭该文件为止。
运行时约束
- 对于 福彭斯 子例程而言, 斯特赖安普特尔, 文件名 或 模式 参数不能是空指针。
- 如果存在运行时约束违例,那么 福彭斯 子例程将不会尝试打开文件。 如果 斯特赖安普特尔 参数不是空指针,那么 福彭斯 子例程会将 斯特赖安普特尔 参数设置为该空指针。
参数
| 项 | 描述 |
|---|---|
| 路径 | 指向一个字符串,该字符串包含要打开的文件的名称。 |
| TYPE | 指向具有以下其中一个值的字符串:
注意:
|
| 流 | 指定输入流。 |
| FileDescriptor | 指定有效的打开文件描述符。 |
| 斯特赖安普特尔 | 指定与文件名相关联的流,并且该值不能为空。 |
| filename | 指定要打开的文件名,且该值不能为空。 |
| 方式 | 值不能为空。 方式参数与为 福通 子例程描述的 类型 参数相同,另外,以字符 W 或 A 开头的方式可以以字符 乌 作为前缀,如下所示:
注: 如果 模式 参数前面未加上 乌,那么文件许可权仅为用户。
|
返回值
如果 弗德开放, 福通, fopen64, 自由 或 freopen64 子例程不成功,那么会返回空指针,并设置 错误号 全局变量以指示错误。
如果 福彭斯 子例程打开文件,那么它将返回零。 如果未打开该文件,或者存在运行时约束违例,那么 福彭斯 子例程将返回非零值。
错误代码
如果以下情况成立,那么 福通, fopen64, 自由 和 freopen64 子例程不成功:
| 项 | 描述 |
|---|---|
| EACCES | 在路径前缀的组件上拒绝搜索许可权,文件存在并且方式指定的许可权被拒绝,或者文件不存在并且拒绝对要创建的文件的父目录的写许可权。 |
| ELOOP | 解析路径时迂到过多的符号链接。 |
| EINTR | 在此过程中接收到信号。 |
| EISDIR | 指定的文件是一个目录,并且进程对它没有写访问权。 |
| ENAMETOOLONG | 文件名的长度超过 PATH_MAX ,或者路径名组件的长度超过 NAME_MAX。 |
| 电子文件 | 当前已打开允许的最大文件数。 |
| ENOENT | 指定的文件不存在,或 文件描述符 参数指向空字符串。 |
| ENOSPC | 尚未创建该文件,并且无法展开要包含新文件的目录或文件系统。 |
| ENOTDIR | 路径前缀的组件不是一个目录。 |
| ENXIO | 指定的文件是字符特殊文件或块特殊文件,并且与此特殊文件相关联的设备不存在。 |
| Eoverflow | 指定的文件是常规文件,并且无法在 off_t 类型的对象中正确表示该文件的大小。 |
| EROFS | 指定的文件位于只读文件系统上,并且没有写访问权。 |
| ETXTBSY | 该文件是正在执行的纯过程 (共享文本) 文件,并且该进程不具有写访问权。 |
如果以下情况成立,那么 弗德开放, 福通, fopen64, 自由 和 freopen64 子例程不成功:
| 项 | 描述 |
|---|---|
| EINVAL | 类型 自变量的值无效。 |
| EINVAL | 模式 自变量的值无效。 |
| 电子文件 | FOPEN_MAX 流当前在调用过程中处于打开状态。 |
| 电子文件 | STREAM_MAX 流当前在调用过程中处于打开状态。 |
| ENAMETOOLONG | 符号链接的路径名解析生成了长度超过 PATH_MAX的中间结果。 |
| ENOMEM | 没有足够的存储空间可用。 |
如果以下情况成立,那么 自由 和 福通 子例程不成功:
| 项 | 描述 |
|---|---|
| Eoverflow | 指定文件的大小大于 2 千兆字节。 |
如果以下情况成立,那么 弗德开放 子例程不成功:
| 项 | 描述 |
|---|---|
| EBADF | 文件描述符 参数的值是无效的。 |
POSIX
| 项 | 描述 |
|---|---|
| w | 将长度 0 为 0 或创建文本文件以进行写入。 |
| W + | 将截断为 0 长度或创建文本文件以进行更新。 |
| a | 打开或创建文本文件以在文件末尾进行写入。 |
| a + | 打开或创建文本文件以进行更新,在文件末尾写入。 |
SAA
至少 8 个流 (包括 3 个标准文本流) 可以同时打开。 同时支持二进制和文本方式。