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) は、 |
(C++17以降) |
ファイルは、std::fopen を、2番目の引数(ファイルアクセスモード)を mode & ~std::ios_base::ate の結果として決定されたものとして呼び出すのと同様に開かれます。結果がテーブルに示されているフラグのいずれかの組み合わせでない場合、open() は失敗します。
| mode & ~std::ios_base::ate | std::fopen アクセス モード |
ファイルが既に存在する場合のアクション | ファイルが存在しない場合のアクション | |||||
|---|---|---|---|---|---|---|---|---|
| 2進 | 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() を呼び出し、失敗を示すためにヌルポインタを返します。
目次 |
[edit] Parameters
| s, str, p | - | 開くファイル名。 s はヌル終端文字列を指している必要があります。 |
| openmode | - | std::ios_base::openmode モードのビットごとの OR |
[edit] Return value
成功した場合は this、失敗した場合はヌルポインタ。
[edit] Notes
open() は通常、std::basic_fstream のコンストラクタまたは open() メンバ関数を通して呼び出されます。
[edit] Example
#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
[edit] Defect reports
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 596 | C++98 | open() は追記モードでファイルを開けませんでした |
追記モードで開くことができます |
[edit] See also
| 関連付けられたファイルが開いているかどうかを確認します。 (public member function) | |
| 書き込み領域バッファをフラッシュし、関連付けられたファイルを閉じる (public member function) |