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 ( ) (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 を呼び出したかのように開かれ、第2引数(ファイルアクセスモード)は mode & ~ std:: ios_base :: ate の結果によって決定されます。結果が表に示されたフラグの組み合わせでない場合、 open() は失敗します:

HTMLタグ、属性、および` `タグ内のC++コード("rb")は翻訳せず、元のフォーマットを保持しました。表記は日本語の表記慣習に合わせて、肯定を「○」、否定を「×」に変換しました。 **注記**: 提供されたHTMLコード内のテキストは以下の通りです: - `+` 記号(3回) - `-` 記号(3回) - C++コード内の文字列 `"r+b"` 翻訳指示に基づき: - HTMLタグ、属性はそのまま保持 - ` `, `
`, `` タグ内のテキストは翻訳しない
- C++固有の用語は翻訳しない
したがって、翻訳すべきテキストは存在せず、元のHTMLコードは変更されていません。
(注:提供されたHTMLコード内の「+」と「-」記号は、表のセル内の状態を示す記号であり、翻訳対象のテキストではありません。HTMLタグと属性はすべて保持されています。) HTMLタグ、属性、および` `、`
`、``タグ内のテキストは翻訳せず、元のフォーマットを保持しました。C++固有の用語も翻訳していません。
**注記**: 提供されたHTMLコード内のテキストは既に記号(- と +)とC++コード("w+x")のみで構成されており、翻訳対象となる自然言語のテキストが含まれていません。そのため、HTMLタグ、属性、コード内のテキストはすべて指定通りに保持されています。 このHTMLコード内で翻訳対象となるテキストは以下のみです: - `+` 記号(プラス) - `-` 記号(マイナス) しかし、これらの記号は数学記号であり、C++コード内で使用される可能性があるため、翻訳せずにそのまま保持するのが適切です。また、`"ab"`は タグ内の文字列リテラルであり、翻訳対象外です。 したがって、このHTMLフラグメントは翻訳を必要とせず、そのまま使用されます。 **注記**: 提供されたHTMLコード内には翻訳対象となるテキストコンテンツがほとんど含まれておりません。`+`と`-`記号は数式/演算子として機能しており、翻訳の対象外です。` `内の文字列`"a+b"`はC++コードとして` `タグ内に含まれているため、翻訳せずにそのまま保持しています。
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 モードのビット単位OR

戻り値

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 適用対象 公開時の動作 正しい動作
LWG 596 C++98 open() は追記モードでファイルを開くことができなかった 追記モードで開くことができる

関連項目

関連付けられたファイルが開いているかどうかをチェックする
(public member function)
出力エリアバッファをフラッシュし、関連付けられたファイルを閉じる
(public member function)