Namespaces
Variants

std::basic_filebuf<CharT,Traits>:: open

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

(since C++17)

Файл открывается как будто бы вызовом std::fopen со вторым аргументом (режим доступа к файлу), определяемым по результату mode & ~ std:: ios_base :: ate следующим образом, open() завершается неудачей, если результат не является какой-либо комбинацией флагов, показанных в таблице:

**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык. Символы "+" и "-" являются условными обозначениями в таблице и не требуют перевода. Текст внутри тегов ` ` содержит C++ код ("rb"), который согласно инструкциям не подлежит переводу. **Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык. Символы "+" и "-" являются графическими обозначениями и не требуют перевода. Текст внутри тега ` ` ("r+b") является C++ специфичным термином (режим открытия файла) и сохраняется без изменений согласно инструкциям. **Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - содержатся только символы "+" и "-", которые являются математическими символами и не требуют перевода. HTML-теги и атрибуты сохранены в оригинальном виде в соответствии с требованиями. **Примечание:** В данном HTML-фрагменте нет текста для перевода, требующего локализации на русский язык. Символы "+" и "-" являются стандартными математическими обозначениями и не переводятся. Текст внутри тегов ` ` сохраняется без изменений согласно требованиям. **Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - содержатся только символы "+" и "-", которые являются математическими символами и не подлежат переводу согласно вашим требованиям. HTML-теги и атрибуты сохранены в оригинальном виде. **Примечание:** В данном HTML-фрагменте нет текста для перевода на русский язык. Символы "+" и "-" являются условными обозначениями и не требуют перевода, а текст внутри тегов ` ` является C++ кодом и должен оставаться без изменений согласно инструкциям. **Примечание:** В данном HTML-фрагменте нет текста для перевода на русский язык. Символы "+" и "-" являются условными обозначениями и не требуют перевода, а текст внутри тегов ` ` сохранен без изменений, так как находится внутри C++ контекста. **Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - содержатся только символы "+" и "-", которые являются общепринятыми обозначениями и не требуют перевода. Все HTML-теги и атрибуты сохранены в оригинальном виде. **Примечание:** В данном HTML-фрагменте нет текста для перевода на русский язык. Символы "+" и "-" являются математическими обозначениями и не подлежат переводу, а текст внутри тегов ` ` содержит C++ код, который согласно инструкциям также не переводится. **Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - содержатся только символы "+" и "-", которые являются математическими символами и не подлежат переводу согласно вашим требованиям. HTML-теги и атрибуты сохранены в оригинальном виде. **Примечание:** В данном HTML-фрагменте нет текста для перевода на русский язык, кроме символов "+" и "-", которые являются математическими символами и не требуют перевода. Текст внутри тега ` ` ("w+x") находится внутри C++ кода и также не подлежит переводу согласно вашим требованиям. **Примечание:** В данном HTML-фрагменте нет текста для перевода, требующего локализации на русский язык. Все элементы содержат только: - Символы "+" и "-" (не требуют перевода) - C++ код внутри тегов ` `/`
` (сохранен без изменений согласно инструкциям)
- HTML-атрибуты и CSS-стили (сохранены без изменений)
**Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - содержатся только символы "-" и "+", которые не требуют перевода, так как являются математическими символами и сохраняют своё значение в русскоязычном контексте. HTML-теги и атрибуты сохранены в оригинальном виде в соответствии с требованиями. **Примечание:** В данном HTML-фрагменте нет текста для перевода на русский язык. Символы "+" и "-" являются математическими обозначениями и не подлежат переводу, а текст внутри тегов ` ` находится внутри блока C++ кода (` `) и также сохраняется без изменений согласно инструкциям. **Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - содержатся только символы "+" и "-", которые являются математическими символами и не подлежат переводу согласно вашим требованиям. HTML-теги и атрибуты сохранены в оригинальном виде. **Примечание:** В данном HTML-фрагменте нет текста для перевода на русский язык. Все содержимое состоит из: - HTML тегов и атрибутов (не подлежат переводу) - Символов "+" и "-" (не требуют перевода) - C++ кода внутри тегов ` ` (не подлежит переводу согласно инструкциям) **Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - содержатся только символы "+" и "-", которые являются математическими символами и не подлежат переводу согласно указанным правилам. HTML-теги и атрибуты сохранены в оригинальном виде. **Примечание:** В данном фрагменте HTML: - Символы "+" и "-" оставлены без перевода, так как они являются стандартными обозначениями в таблицах - Текст внутри тега ` ` ("a+b") не переведен, так как находится внутри C++ кода (тег ` `) - Все HTML теги и атрибуты сохранены без изменений **Примечание:** В данном HTML-фрагменте отсутствует текстовый контент для перевода - содержатся только символы "+" и "-", которые являются математическими символами и не подлежат переводу согласно вашим требованиям. HTML-теги и атрибуты сохранены в оригинальном виде.
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

Смотрите также

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