• 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+
    为 追加操作 (在文件尾写) 打开 文件. 如果 文件 不存在, 就 创建 它. 读文件的初始位置 是 文件 的 开始, 但是 写文件 总是 被追加到 文件 的 末尾.

    可以 把 字母 ``b'' 添加到 字符串 mode 的 末尾, 或者 插到 上面 任何 两个字符的 字符串 的 中间. 这样 只是 为了 和 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 创建的 流 时, 也不关闭 该文件描述符. 对 共享内存对象 实施 fdopen 的 结果 没有定义.

    freopen 函数 打开 用 path 说明 的 文件, 并且 和 stream 指定的流 联系 起来. 原来的流 (如果 存在的话) 被关闭. 参数 modefopen 中的 用法 一样. 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) 指定的值. 

  • 相关阅读:
    Nginx rewrite模块深入浅出详解
    一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
    nginx: [emerg] getpwnam(“www”) failed错误
    mysql5.7 启动报发生系统错误2
    obv15 实例6:如果K线柱过多,ZIG将发生变动,导致明显的OBV15指标被隐藏!
    obv15 案例4,待日后分析
    稳定
    教你识别指标骗局:以某家捕捞季节和主力追踪为例讲解
    C++ 语句
    C++ 表达式
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11082351.html
Copyright © 2020-2023  润新知