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.
| Перегрузка (4) предоставляется только если | (с 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" |
||
| + | + | + | + | - | + |
"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::openmode |
Возвращаемое значение
this при успехе, нулевой указатель при ошибке.
Примечания
open() обычно вызывается через конструктор или член-функцию open() объекта std::basic_fstream.
Пример
#include <fstream>
#include <iostream>
int main()
{
std::string filename = "Test.b";
std::filebuf fb;
// prepare a file to read
double d = 3.14;
if (!fb.open(filename, std::ios::binary | std::ios::out))
{
std::cout << "Open file " << filename << " for write failed\n";
return 1;
}
fb.sputn(reinterpret_cast<char*>(&d), sizeof d);
fb.close();
// open file for reading
double d2 = 0.0;
if (!fb.open(filename, std::ios::binary | std::ios::in))
{
std::cout << "Open file " << filename << " for read failed\n";
return 1;
}
auto got = fb.sgetn(reinterpret_cast<char*>(&d2), sizeof d2);
if (sizeof(d2) != got)
std::cout << "Read of " << filename << " failed\n";
else
std::cout << "Read back from file: " << d2 << '\n';
}Вывод:
Read back from file: 3.14
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 596 | C++98 |
open() не мог открыть файлы в режиме добавления | может открывать в режиме добавления |
См. также
| проверяет, открыт ли связанный файл (публичная член-функция) |
|
| очищает буфер области записи и закрывает связанный файл (публичная член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_filebuf/open