std::basic_filebuf<CharT,Traits>:: open
|
basic_filebuf
*
open
(
const
char
*
s,
std::
ios_base
::
openmode
mode
)
;
|
(1) | |
|
basic_filebuf
*
open
(
const
std::
string
&
str,
std::
ios_base
::
openmode
mode
)
;
|
(2) | (C++11 起) |
|
basic_filebuf
*
open
(
const
std::
filesystem
::
path
&
p,
std:: ios_base :: openmode mode ) ; |
(3) | (C++17 起) |
|
basic_filebuf
*
open
(
const
std
::
filesystem
::
path
::
value_type
*
s,
std:: ios_base :: openmode mode ) ; |
(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 起) |
文件打开方式如同调用
std::fopen
,其第二个参数(文件访问模式)由
mode
&
~
std::
ios_base
::
ate
的结果决定,具体如下:若结果不是表中所示标志的组合,则
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" | ||
| + | ||||||||
如果打开操作成功且
(
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::openmode 模式的按位或组合 |
返回值
this 在成功时返回此指针,失败时返回空指针。
注释
open()
通常通过构造函数或
std::basic_fstream
的
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()
无法以追加模式打开文件
|
可以以追加模式打开 |
参见
|
检查关联文件是否已打开
(公开成员函数) |
|
|
刷新输出区缓冲区并关闭关联文件
(公开成员函数) |