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 参 见
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh