国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > fopen 以获得更好的体验。

# C 语言标准库函数 fopen

在头文件 stdio.h 中定义。
/*********************************************
 * @brief 打开文件
 * @param filename 文件路径
 * @param mode 打开模式
 * @return 文件流的指针
 ********************************************/
FILE* fopen(const char* restrict filename, const char* restrict mode);

!subtitle:说明

打开文件。返回的文件指针需要使用 fclose 函数进行关闭。

!subtitle:参数

  • filename - 文件路径

  • mode - 文件的访问模式

!subtitle:返回值

  • 打开的文件流指针

  • 失败时返回 NULL

# 文件访问模式

模式说明符 标准 意义 说明 操作权限 如果文件存在 如果文件不存在
"r" C89 读模式 打开文件进行读取 从文件开头进行操作 打开失败
"w" C89 写模式 创建用于写入的文件 清空原文件 新建文件
"a" C89 追加模式 追加写入文件 从文件末尾进行操作 新建文件
补充说明符 标准 意义 说明 操作权限 示例
"+" C89 扩展模式 文件既可读也可写 可读可写 "r+" "w+" "a+"
"b" C89 二进制模式 以二进制模式打开文件 "rb" "wb" "ab" "w+b"
"x" C11 独占模式 文件已存在时强制失败 "wx" "w+x" "w+bx"
  • 文本模式下(即不含 "b"),读写文件时会跳过不可打印字符,参考 isprint。但在类 POSIX 系统上无效,类 POSIX 系统始终以二进制模式打开

  • 追加模式("a")下,无论文件位置指示器的当前位置如何,进行写操作时都会向文件末尾写入。

  • 扩展模式("+")下,文件既可读也可写,但进行写入后需要调用 fflushfseek 才能进行读操作,进行读取后需要调用 fseek 后才能进行写操作。

# 示例

#include <stdio.h>

int main(void)
{
    // 打开文件
    FILE* fp = fopen("/tmp/test.txt", "w+");

    if (fp == NULL)
    {
        perror("文件打开失败");
        return 1;
    }

    // 写文件
    fputs("Hello World\n", fp);

    // 重置文件位置指示器到文件开头
    fseek(fp, 0, SEEK_SET);

    // 读取文件并打印
    int ch;
    while ((ch = fgetc(fp)) != EOF)
    {
        putchar(ch);
    }

    // 关闭文件
    fclose(fp);
    
    return 0;
}

运行结果:

Hello World

# 推荐阅读

# 参考标准

  • C17 standard (ISO/IEC 9899:2018):

    • 7.21.5.3 The fopen function (p: 223-224)

  • C11 standard (ISO/IEC 9899:2011):

    • 7.21.5.3 The fopen function (p: 305-306)

  • C99 standard (ISO/IEC 9899:1999):

    • 7.19.5.3 The fopen function (p: 271-272)

  • C89/C90 standard (ISO/IEC 9899:1990):

    • 4.9.5.3 The fopen function

本文 更新于: 2025-11-27 09:38:08 创建于: 2025-11-27 09:38:08