Manpages

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, fdopenfreopen 将 返 回 一 个 指 向 文 件 对 象 FILE 的 指 针 。 否 则 , 将 返 回 NULL 并 将 设 置 全 局 变 量 errno 的 值 来 指 示 错 误 发 生 。

ERRORS

EINVAL

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

函 数 fopen, fdopenfreopen 也 有 可 能 失 败 并 置 errnomalloc(3) 指 定 的 值 。 函 数 fopen 也 有 可 能 失 败 并 置 errnoopen(2) 指 定 的 值 。 函 数 fdopen 也 有 可 能 失 败 并 置 errnofcntl(2) 指 定 的 值 。 函 数 freopen 也 有 可 能 失 败 并 置 errnoopen(2), fclose(3)fflush(3) 指 定 的 值 。

CONFORMING TO 标 准 参 考

函 数 fopenfreopen 遵 循 ANSI X3.159-1989 (’’ANSI C’’) 标 准 。 函 数 fdopen 遵 循 IEEE Std1003.1-1988 (’’POSIX.1’’) 标 准 。

SEE ALSO 参 见

open(2), fclose(3), fileno(3)

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh

COMMENTS