fopen , fopen64, freopen , freopen64, fopen_s 或 fdopen 子例程

用途

打开流并处理运行时约束违例。

标准 C 库 (libc.a)

语法

#include <stdio.h>
#define STDC_WANT_LIB_EXT1 1
FILE  *fopen ( Path Type)
const char *Path, *Type;

FILE  *fopen64 ( Path Type)
char  *Path, *Type;

FILE  *freopen (PathType Stream)
const char *Path, *Type;
FILE  *Stream;

FILE  *freopen64 (PathType Stream)
char  *Path, *Type;
FILE  *Stream;

FILE  *fdopen ( FileDescriptorType)
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 打开文件以进行追加 (在文件末尾写入)。 通过 弗德开放 子例程指定的 类型 参数的方式值必须与最初打开或创建文件时指定的文件方式一致。

注: 必须避免将 弗德开放 子例程与从对 Shm_open 子例程的调用中获取的文件描述符配合使用,并可能导致下一次 弗朗弗卢什 调用时发生错误。

在类型为 off_t 的对象中可以正确表示的最大值将被确定为打开文件描述中的最大偏移量。

福彭斯 子例程通过使用 文件名 参数指向的字符串的名称来打开文件,并将流与文件关联。

打开文件以使用互斥 (也称为非共享) 访问权进行写入。 如果创建了文件,并且 模式 参数的第一个字符不是 ,并且如果底层系统支持互斥方式概念,那么该文件具有阻止系统上其他用户访问该文件的许可权。

如果创建了文件并且 模式 参数的第一个字符为 ,那么该文件将保留系统缺省文件访问许可权,直到该文件关闭为止。

如果成功打开该文件,那么指向 斯特赖安普特尔 参数所指向的 文件 结构的指针将设置为指向控制打开的文件的对象的指针。 否则,指向 斯特赖安普特尔 参数所指向的 文件 结构的指针将设置为空指针,并且该文件将保留系统缺省文件访问许可权,直至关闭该文件为止。

运行时约束

  1. 对于 福彭斯 子例程而言, 斯特赖安普特尔文件名模式 参数不能是空指针。
  2. 如果存在运行时约束违例,那么 福彭斯 子例程将不会尝试打开文件。 如果 斯特赖安普特尔 参数不是空指针,那么 福彭斯 子例程会将 斯特赖安普特尔 参数设置为该空指针。

参数

描述
路径 指向一个字符串,该字符串包含要打开的文件的名称。
TYPE 指向具有以下其中一个值的字符串:
R
打开文本文件以进行读取。
w
创建新的文本文件以进行写入,或者打开文件并 0 长度为 0。
a
附加 (打开文本文件以在文件末尾进行写入,或创建文件以进行写入)。
雷布
打开二进制文件以进行读取。
世界
创建用于写入的二进制文件,或者打开文件并将其截断为 0。
ab
追加 (打开一个二进制文件以在文件末尾进行写入,或者创建一个文件以进行写入)。
r +
打开文件以进行更新 (读和写)。
W +
截断或创建一个文件以进行更新。
a +
追加 (打开一个文本文件以在文件末尾进行写入,或者创建一个文件以进行写入)。
r + b , rb +
打开二进制文件以进行更新 (读和写)。
W + b , wb +
创建二进制文件以进行更新,或者打开文件并截断长度为 0 的文件。
a + b , 阿拉伯 +
追加 (打开二进制文件以进行更新,在文件末尾进行写入,或者创建文件以进行写入)。
世界
创建文本文件以进行写入。
世界
创建用于写入的二进制文件。
w + x
创建文本文件以进行更新。
w + bx 或 wb + x
创建用于更新的二进制文件。
注意:
  • 操作系统未区分文本文件和二进制文件。
  • 将忽略 类型 参数中的 B 值。
  • 如果文件已存在或无法创建,那么以互斥方式打开文件 (X 作为方式参数中的最后一个字符) 将失败。 否则,如果底层系统支持互斥访问,那么将创建具有互斥 (也称为非共享) 访问权的文件。
  • 弗德开放 子例程对互斥方式没有影响。
指定输入流。
FileDescriptor 指定有效的打开文件描述符。
斯特赖安普特尔 指定与文件名相关联的流,并且该值不能为空。
filename 指定要打开的文件名,且该值不能为空。
方式 值不能为空。 方式参数与为 福通 子例程描述的 类型 参数相同,另外,以字符 WA 开头的方式可以以字符 作为前缀,如下所示:
将截断为 0 或创建文本文件以进行写入,并且具有缺省许可权。
乌夫克斯
创建用于写入的文本文件并具有缺省许可权。
ua
打开或创建文本文件以在文件结束时进行写入,并且具有缺省许可权。
乌布
将截断为 0 ,或者创建用于写入的二进制文件并具有缺省许可权。
乌布克斯
创建用于写入的二进制文件并具有缺省许可权。
UAB
打开或创建一个二进制文件以在文件末尾进行写入,并且具有缺省许可权。
uw +
将截断为 0 或创建文本文件以进行更新,并且具有缺省许可权。
uw + x
创建要更新的文本文件并具有缺省许可权。
ua + append
打开或创建文本文件以在文件结束时进行更新和写入,并具有缺省许可权。
uw + b 或 uwb +
将截断为 0 或创建二进制文件以进行更新,并且具有缺省许可权。
uw + bx 或 uwb + x
创建用于更新的二进制文件并具有缺省许可权。
ua + b 或 uab + append
打开或创建一个二进制文件以在文件末尾进行更新和写入,并且具有缺省许可权。
注: 如果 模式 参数前面未加上 ,那么文件许可权仅为用户。

返回值

如果 弗德开放福通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 个标准文本流) 可以同时打开。 同时支持二进制和文本方式。