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/cpp/io/basic_filebuf/open

Spec-Zone.ru

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