Namespaces
Variants

std:: fopen

From cppreference.net
< cpp ‎ | io ‎ | c
定义于头文件 <cstdio>
std:: FILE * fopen ( const char * filename, const char * mode ) ;

打开由 filename 指定的文件,并返回与该文件关联的文件流。 mode 用于确定文件访问模式。

目录

参数

filename - 与文件流相关联的文件名
mode - 决定 文件访问模式 的以空字符结尾的字符串

文件访问标志

文件访问
模式字符串
含义 说明 文件已存在时的操作 文件不存在时的操作
"r" 读取 打开文件用于读取 从起始位置读取 返回 NULL 并设置错误
"w" 写入 创建文件用于写入 销毁内容 创建新文件
"a" 追加 追加到文件 写入到末尾 创建新文件
"r+" 扩展读取 打开文件用于读取/写入 从起始位置读取 返回 NULL 并设置错误
"w+" 扩展写入 创建文件用于读取/写入 销毁内容 创建新文件
"a+" 扩展追加 打开文件用于读取/写入 写入到末尾 创建新文件
文件访问模式标志 "b" 可选择性地指定以 二进制模式 打开文件。该标志在POSIX系统上无效,但在Windows等系统上会禁用对 ' \n ' ' \x1A ' 的特殊处理。
在追加文件访问模式下,无论文件位置指示器的当前位置如何,数据始终写入文件末尾。
文件访问模式标志 "x" 可选择性地附加到 "w" "w+" 说明符后。该标志强制函数在文件已存在时失败,而不是覆盖文件。 (C++17)
如果模式不是上述列出的字符串之一,则行为未定义。某些实现定义了额外支持的模式(例如 Windows )。

返回值

若成功,返回指向已打开文件流控制对象的指针,同时清除eof和error位。除非 filename 指向交互式设备,否则该流为全缓冲状态。

发生错误时,返回空指针。 POSIX标准要求 在这种情况下设置 errno

注释

filename 的格式由实现定义,并不必然指向文件(例如可能是控制台或其他可通过文件系统API访问的设备)。在支持路径的平台上, filename 可包含绝对或相对的文件系统路径。

关于可移植目录和文件命名,请参阅 C++ filesystem library boost.filesystem

示例

#include <cstdio>
#include <cstdlib>
int main()
{
    int is_ok = EXIT_FAILURE;
    FILE* fp = std::fopen("/tmp/test.txt", "w+");
    if (!fp)
    {
        std::perror("File opening failed");
        return is_ok;
    }
    int c; // 注意:需要 int 类型而非 char 类型来处理 EOF
    while ((c = std::fgetc(fp)) != EOF) // 标准 C I/O 文件读取循环
        std::putchar(c);
    if (std::ferror(fp))
        std::puts("I/O error when reading");
    else if (std::feof(fp))
    {
        std::puts("End of file reached successfully");
        is_ok = EXIT_SUCCESS;
    }
    std::fclose(fp);
    return is_ok;
}

输出:

End of file reached successfully

参见

td> 将输出流与实际文件同步
(函数)
关闭文件
(函数)
使用不同名称重新打开现有流
(函数)