Spec-Zone.ru › C++

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) предоставляется только если std::filesystem::path::value_type не char.

(с 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() не мог открыть файлы в режиме добавления может открывать в режиме добавления

См. также

is_open
проверяет, открыт ли связанный файл
(публичная член-функция)
close
очищает буфер области записи и закрывает связанный файл
(публичная член-функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_filebuf/open

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API