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 ( ) (since C++17) или str. c_str ( ) , в зависимости от перегрузки). std::ios_base::openmode значения могут быть записаны как, например, std:: ios_base :: out | std:: ios_base :: app .
|
Перегрузка
(4)
предоставляется только если
|
(since 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; // подготовка файла для чтения 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(); // открытие файла для чтения 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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 596 | C++98 |
open()
could not open files in append mode
|
can open in append mode |
Смотрите также
|
проверяет, открыт ли связанный файл
(публичная функция-член) |
|
|
сбрасывает буфер области вывода и закрывает связанный файл
(публичная функция-член) |