std::basic_filebuf<CharT,Traits>::open
来自cppreference.com
< cpp | io | basic filebuf
std::basic_filebuf<CharT, Traits>* open( const char* s, std::ios_base::openmode mode ) |
(1) | |
std::basic_filebuf<CharT, Traits>* open( const std::string& str, std::ios_base::openmode mode ) |
(2) | (C++11 起) |
std::basic_filebuf<CharT, Traits>* open( const std::filesystem::path& p, std::ios_base::openmode mode ) |
(3) | (C++17 起) |
std::basic_filebuf<CharT, Traits>* open( const std::filesystem::path::value_type* s, |
(4) | (C++17 起) |
如果关联文件已打开(is_open() != false),那么立即返回空指针。
否则,打开拥有给定名称(s、p.c_str() (C++17 起) 或 str.c_str(),取决于重载)的文件。std::ios_base::openmode 值可以写成例如 std::ios_base::out | std::ios_base::app 这样的形式。
只有在 |
(C++17 起) |
如同通过以 mode & ~std::ios_base::ate 的结果按下列方式确定的第二参数 (文件访问模式) 调用 std::fopen 打开文件,open()
在结果不是以下标志位的组合之一的情况下会失败:
mode & ~std::ios_base::ate | std::fopen 访问模式 |
文件已存在时 的动作 |
文件不存在时 的动作 | |||||
---|---|---|---|---|---|---|---|---|
binary | in | out | trunc | app | noreplace (C++23 起) | |||
- | + | - | - | - | - | "r" | 从头读取 | 打开失败 |
+ | + | - | - | - | - | "rb" | ||
- | + | + | - | - | - | "r+" | 错误 | |
+ | + | + | - | - | - | "r+b" | ||
- | - | + | - | - | - | "w" | 销毁内容 | 创建新文件 |
- | - | + | + | - | - | |||
+ | - | + | - | - | - | "wb" | ||
+ | - | + | + | - | - | |||
- | + | + | + | - | - | "w+" | ||
+ | + | + | + | - | - | "w+b" | ||
- | - | + | - | - | + | "wx" | 打开失败 | 创建新文件 |
- | - | + | + | - | + | |||
+ | - | + | - | - | + | "wbx" | ||
+ | - | + | + | - | + | |||
- | + | + | + | - | + | "w+x" | ||
+ | + | + | + | - | + | "w+bx" | ||
- | - | + | - | + | - | "a" | 写入结尾 | 创建新文件 |
- | - | - | - | + | - | |||
+ | - | + | - | + | - | "ab" | ||
+ | - | - | - | + | - | |||
- | + | + | - | + | - | "a+" | ||
- | + | - | - | + | - | |||
+ | + | + | - | + | - | "a+b" | ||
+ | + | - | - | + | - |
如果打开操作成功且 (openmode & std::ios_base::ate) != 0(设置了 ate
位),那么重寻位文件位置到文件尾,如同用调用 std::fseek(file, 0, SEEK_END),其中 file 是调用 std::fopen 返回的指针。如果寻位失败,那么就会调用 close() 并返回空指针以指示失败。
参数
s, str, p | - | 要打开的文件名;s 必须指向空终止字符串 |
openmode | - | 文件打开模式,std::ios_base 模式的二进制或 |
返回值
成功时返回 this,失败时返回空指针。
注意
常由 std::basic_fstream 的构造函数或 open()
成员函数调用 open()
。
示例
运行此代码
#include <fstream> #include <iostream> int main() { std::string filename = "Test.b"; std::filebuf fb; // 准备文件以读取 double d = 3.14; if (!fb.open(filename, std::ios::binary | std::ios::out)) { std::cout << "为写入打开文件 " << filename << " 失败\n"; return 1; } fb.sputn(reinterpret_cast<char*>(&d), sizeof d); fb.close(); // 为读取打开文件 double d2 = 0.0; if (!fb.open(filename, std::ios::binary | std::ios::in)) { std::cout << "为读取打开文件 " << filename << " 失败\n"; return 1; } auto got = fb.sgetn(reinterpret_cast<char*>(&d2), sizeof d2); if (sizeof(d2) != got) std::cout << "读取 " << filename << " 失败\n"; else std::cout << "从文件读回:" << d2 << '\n'; }
输出:
从文件读回:3.14
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 596 | C++98 | open() 不能以追加模式打开文件
|
可以以追加模式打开 |
参阅
检查关联文件是否打开 (公开成员函数) | |
冲入放置区缓冲区并关闭关联的文件 (公开成员函数) |