FOPEN(3)

NAME
fopen, fdopen, freopen - 打开流

SYNOPSIS 总览
#include <stdio.h>

FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fildes, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);

DESCRIPTION 描述
函数 fopen 打开文件名为 path 指向的字符串的文件，将一个流与它关联。

参数 mode 指向一个字符串，以下列序列之一开始 (序列之后可以有附加的字符):

r   打开文本文件，用于读。流被定位于文件的开始。

r+  打开文本文件，用于读写。流被定位于文件的开始。

w   将文件长度截断为零，或者创建文本文件，用于写。流被定位于文件的开始。

w+  打开文件，用于读写。如果文件不存在就创建它，否则将截断它。流被定位于文件的开始。

a   打开文件，用于追加 (在文件尾写)。如果文件不存在就创建它。流被定位于文件的末尾。

a+  打开文件，用于追加 (在文件尾写)。如果文件不存在就创建它。读文件的初始位置是文件的开始，但是输出总是被追加到文件的末尾。

字符串 mode 也可以包含字母 ``b'' 作为最后一个字符，或者插入到上面提到的任何双字符的字符串的两个字符中间。这样只是为了和 ANSI X3.159-1989 (``ANSI C'') 标准严格保持兼容，没有实际的效果；在所有的遵循 POSIX 的系统中，``b'' 都被忽略，包括 Linux。(其他系统可能将文本文件和二进制文件区别对待，如果在进行二进制文件的 I/O，那么添加 ``b'' 是个好主意，因为你的程序可能会被移植到非 Unix 环境中。)

任何新建的文件将具有模式 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH (0666)，然后以进程的掩码值 umask 加以修改 (参见 umask(2)) 。

在读/写流上进行的读和写操作可以以任意的顺序混合使用。注意 ANSI C 要求文件定位函数只能插入在输出和输入之间，除非输入操作遇到了文件结束符。(如果没有遇到这种情况，那么读取总是能返回除了最近写入内容之外的结果。) 因此，最好 (在 Linux 中有时是必须的) 在对这样的流进行的写和读操作之间加入一个 fseek 或是 fgetpos 操作。这个操作可以是对显式的定位的调用 (例如在 fseek(..., 0L, SEEK_CUR) 中那样)，利用同时发生的副作用。(?)

以追加方式打开文件 (以 a 作为 mode 的第一个字符) 将使得所有后续的对这个流的写操作发生在文件末尾，就好像在写之前调用了
    fseek(stream,0,SEEK_END);
一样。

函数 fdopen 将一个流关联到已存在的文件描述符， fildes. 流的模式 mode (取值为 "r", "r+", "w", "w+", "a", "a+" 之一) 必须与文件描述符的模式想匹配。新的流的定位标识被设置为 fildes 原有的值，错误和文件结束标记被清除。模式 "w" 或者 "w+" 不会截断文件。文件描述符不会被复制，在关闭由 fdopen 创建的流时，也不会被关闭。对共享内存对象实施 fdopen 的结果是未定义的。

函数 freopen 打开名称为 path 指向的字符串的文件，将它与 stream 指向的流关联。初始的流 (如果存在的话) 被关闭。参数 mode 与在函数 fopen 中用法一致。函数 freopen 主要的用处是改变与标准文本流 (stderr, stdin, 或 stdout) 相关联的文件

RETURN VALUE 返回值
如果成功执行了 fopen, fdopen 和 freopen 将返回一个指向文件对象 FILE 的指针。否则，将返回 NULL 并将设置全局变量 errno 的值来指示错误发生。

ERRORS

EINVAL
    为 fopen, fdopen, 或 freopen 提供的参数 mode 非法。

函数 fopen, fdopen 和 freopen 也有可能失败并置 errno 为 malloc(3) 指定的值。

函数 fopen 也有可能失败并置 errno 为 open(2) 指定的值。

函数 fdopen 也有可能失败并置 errno 为 fcntl(2) 指定的值。

函数 freopen 也有可能失败并置 errno 为 open(2), fclose(3) 和 fflush(3) 指定的值。

CONFORMING TO 标准参考
函数 fopen 和 freopen 遵循 ANSI X3.159-1989 (``ANSI C'') 标准。函数 fdopen 遵循 IEEE Std1003.1-1988 (``POSIX.1'') 标准。

SEE ALSO 参见
open(2), fclose(3), fileno(3)