forked from cpprefjp/site
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(basic_ofstream): add basic_ofstream
- Loading branch information
Showing
6 changed files
with
369 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# basic_ofstream | ||
* fstream[meta header] | ||
* std[meta namespace] | ||
* class[meta id-type] | ||
|
||
```cpp | ||
namespace std { | ||
template <class CharT, class Traits = char_traits<CharT>> | ||
class basic_ofstream : public basic_iostream<CharT, Traits>; | ||
|
||
using ofstream = basic_ofstream<char>; | ||
using wofstream = basic_ofstream<wchar_t>; | ||
} | ||
``` | ||
* char_traits[link /reference/string/char_traits.md] | ||
* basic_istream[link /reference/istream/basic_istream.md] | ||
## 概要 | ||
少なくとも書き込み操作のできるファイルストリーム | ||
## メンバ関数 | ||
| 名前 | 説明 | 対応バージョン | | ||
|--------------------------------------------------|--------------------------------------|----------------| | ||
| [(constructor)](basic_ofstream/op_constructor.md) | コンストラクタ | | | ||
| (destructor) | デストラクタ | | | ||
| `operator=` | ムーブ代入 | C++11 | | ||
| `swap` | 値の交換 | C++11 | | ||
| [`rdbuf`](basic_ofstream/rdbuf.md) | ストリームバッファオブジェクトの取得 | | | ||
| [`is_open`](basic_ofstream/is_open.md) | ファイルを開いているかの判定 | | | ||
| [`open`](basic_ofstream/open.md) | ファイルを開く | | | ||
| [`close`](basic_ofstream/close.md) | ファイルを閉じる | | | ||
## 非メンバ関数 | ||
| 名前 | 説明 | 対応バージョン | | ||
|--------|-------------------------------|----------------| | ||
| `swap` | 2つのオブジェクトを入れ替える | C++11 | | ||
## メンバ型 | ||
| 名前 | 説明 | 対応バージョン | | ||
|------------------|-------------------------------|----------------| | ||
| `char_type` | テンプレート仮引数`CharT` | | | ||
| `int_type` | `Traits::int_type` | | | ||
| `pos_type` | `Traits::pos_type` | | | ||
| `off_type` | `Traits::off_type` | | | ||
| `traits_type` | テンプレート仮引数`Traits` | | | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
# close | ||
* fstream[meta header] | ||
* std[meta namespace] | ||
* basic_ofstream[meta class] | ||
* function[meta id-type] | ||
|
||
```cpp | ||
void close(); | ||
``` | ||
|
||
## 概要 | ||
|
||
ファイルを閉じる | ||
|
||
## 効果 | ||
|
||
[`rdbuf()->close()`](/reference/fstream/basic_filebuf/close.md)を呼び出す。その戻り値が戻り値がヌルポインタだった場合、[`setstate(failbit)`](/reference/ios/basic_ios/setstate.md)を呼び出す。 | ||
|
||
## 例 | ||
|
||
```cpp example | ||
#include <iostream> | ||
#include <fstream> | ||
|
||
int main() | ||
{ | ||
std::ofstream fs("foo"); | ||
fs.close(); | ||
std::cout << std::boolalpha << fs.is_open() << std::endl; | ||
} | ||
``` | ||
* std::ofstream[link /reference/fstream/basic_ofstream.md] | ||
* std::boolalpha[link /reference/ios/boolalpha.md] | ||
* close()[color ff0000] | ||
|
||
### 出力 | ||
|
||
``` | ||
false | ||
``` | ||
|
||
## バージョン | ||
### 言語 | ||
- C++98 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
# is_open | ||
* fstream[meta header] | ||
* std[meta namespace] | ||
* basic_ofstream[meta class] | ||
* function[meta id-type] | ||
|
||
```cpp | ||
bool is_open() const; | ||
``` | ||
|
||
## 概要 | ||
|
||
開いている状態であることの判定をする。 | ||
|
||
## 戻り値 | ||
|
||
[`rdbuf()->is_open()`](/reference/fstream/basic_filebuf/is_open.md) | ||
|
||
## 例 | ||
|
||
```cpp example | ||
#include <iostream> | ||
#include <fstream> | ||
|
||
int main() | ||
{ | ||
std::ofstream fs("foo", std::ios_base::out); | ||
if (fs.is_open()) { | ||
std::cout << "opened" << std::endl; | ||
} | ||
} | ||
``` | ||
* std::ofstream[link /reference/fstream/basic_ofstream.md] | ||
* is_open()[link ff0000] | ||
|
||
### 出力 | ||
|
||
``` | ||
opened | ||
``` | ||
|
||
## バージョン | ||
### 言語 | ||
- C++98 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
# コンストラクタ | ||
* fstream[meta header] | ||
* std[meta namespace] | ||
* basic_ofstream[meta class] | ||
* function[meta id-type] | ||
|
||
```cpp | ||
basic_ofstream(); // (1) | ||
explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out); // (2) | ||
explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out); // (3) | ||
explicit basic_ofstream(const filesystem::path::value_type* s, | ||
ios_base::openmode mode = ios_base::out); // (4) C++17 | ||
explicit basic_ofstream(const filesystem::path& s, | ||
ios_base::openmode mode = ios_base::out); // (5) C++17 | ||
basic_ofstream(const basic_ofstream& rhs) = delete; // (6) C++11 | ||
basic_ofstream(basic_ofstream&& rhs); // (7) C++11 | ||
``` | ||
## 概要 | ||
オブジェクトを構築する。一部のオーバーロードでは、ファイルを開く機能を持っている。 | ||
## 効果 | ||
- (1) : デフォルトコンストラクタ。空の状態にする。 | ||
- (2) : 仮引数`s`で指定したファイルを開く。 | ||
- [`rdbuf()->open(s, mode | std::ios_base::out)`](/reference/fstream/basic_filebuf/open.md)を呼び出す(少なくとも書き込み操作ができる)。その結果が失敗だった(戻り値がヌルポインタだった)場合、[`setstate(failbit)`](/reference/ios/basic_ios/setstate.md)を呼び出す。 | ||
- (3) : ファイルを指定する引数の型が`std::string`である点を除き、(2)と同じ。 | ||
- (4) : [`std::filesystem::path::value_type`](/reference/filesystem/path.md)の型が`char`ではないときのみ定義される。効果は(2)と同じ。 | ||
- (5) : ファイルを指定する引数の型が[`std::filesystem::path`](/reference/filesystem/path.md)である点を除き、(2)と同じ。 | ||
- (6) : コピーコンストラクタ。コピー不可。 | ||
- (7) : ムーブコンストラクタ。ファイルストリームの所有権を移動する。 | ||
## 例 | ||
```cpp example | ||
#include <iostream> | ||
#include <fstream> | ||
int main() | ||
{ | ||
std::ofstream s1("file.txt"); | ||
if (!s1) { | ||
std::cerr << "ファイルを開けませんでした。" << std::endl; | ||
} | ||
try | ||
{ | ||
std::ofstream s2("internal.dat", std::ios_base::in | std::ios_base::out | std::ios_base::binary); | ||
s2.exceptions(std::ios_base::failbit); | ||
} catch (const std::exception& e) { | ||
std::cerr << "ファイルを開けませんでした。" << std::endl; | ||
} | ||
} | ||
``` | ||
* exceptions[link /reference/ios/basic_ios/exceptions.md] | ||
|
||
### 出力 | ||
``` | ||
ファイルを開けませんでした。 | ||
``` | ||
|
||
## 実装例 | ||
|
||
例示のため、`basic_ofstream<>`が内部で保持している`basic_filebuf`オブジェクトを、仮にメンバ変数`sb`とする。 | ||
|
||
```cpp | ||
// (1) | ||
template<class CharT, class Traits> | ||
basic_ofstream<CharT, Traits>::basic_ofstream() : basic_istream(&sb), sb() { | ||
// 本体は空 | ||
} | ||
|
||
// (2) | ||
template<class CharT, class Traits> | ||
basic_ofstream<CharT, Traits>::basic_ofstream(const char* s, ios_base::openmode mode) : basic_istream(&sb), sb() { | ||
if (rdbuf()->open(s, mode | ios_base::out) == nullptr) { | ||
setstate(failbit); | ||
} | ||
} | ||
|
||
// (3) | ||
template<class CharT, class Traits> | ||
basic_ofstream<CharT, Traits>::basic_ofstream(const string& s, ios_base::openmode mode) : basic_ofstream(s.c_str(), mode) { | ||
// 本体は空 | ||
} | ||
|
||
// (5) | ||
template<class CharT, class Traits> | ||
basic_ofstream<CharT, Traits>::basic_ofstream(basic_ofstream&& rhs) : basic_istream(move(rhs)), sb(move(rhs.sb)) { | ||
set_rdbuf(&sb); | ||
} | ||
``` | ||
## バージョン | ||
### 言語 | ||
- C++98 | ||
- C++11: ムーブコンストラクタの追加 | ||
- C++17: `std::filesystem::path`への対応 | ||
## 参照 | ||
- [LGW issue 2676. Provide filesystem::path overloads for File-based streams](https://wg21.cmeerw.net/lwg/issue2676) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
# open | ||
* fstream[meta header] | ||
* std[meta namespace] | ||
* basic_ofstream[meta class] | ||
* function[meta id-type] | ||
|
||
```cpp | ||
void open( | ||
const char* s, | ||
ios_base::openmode mode = ios_base::out); // (1) | ||
void open( | ||
const filesystem::path::value_type* s, | ||
ios_base::openmode mode = ios_base::out); // (2) C++17 | ||
void open( | ||
const string& s, | ||
ios_base::openmode mode = ios_base::out); // (3) | ||
void open( | ||
const filesystem::path& s, | ||
ios_base::openmode mode = ios_base::out); // (4) C++17 | ||
``` | ||
## 概要 | ||
ファイルを開く | ||
## 効果 | ||
- (1) : 仮引数`s`で指定したファイルを開く。 | ||
- [`rdbuf()->open(s, mode | std::ios_base::out)`](/reference/fstream/basic_filebuf/open.md)を呼び出す。その結果が成功だった(戻り値がヌルポインタではなかった)場合、[`clear()`](/reference/ios/basic_ios/clear.md)を呼び出す。その結果が失敗だった(戻り値がヌルポインタだった)場合、[`setstate(failbit)`](/reference/ios/basic_ios/setstate.md)を呼び出す。 | ||
- (2) : [`std::filesystem::path::value_type`](/reference/filesystem/path.md)の型が`char`ではないときのみ定義される。効果は(1)と同じ。 | ||
- (3) : ファイルを指定する引数の型が`std::string`である点を除き、(1)と同じ。 | ||
- (4) : ファイルを指定する引数の型が[`std::filesystem::path`](/reference/filesystem/path.md)である点を除き、(1)と同じ。 | ||
## 例 | ||
```cpp example | ||
#include <iostream> | ||
#include <fstream> | ||
int main() | ||
{ | ||
std::ofstream s1; | ||
s1.open("file.txt"); | ||
if (!s1) { | ||
std::cerr << "ファイルを開けませんでした。" << std::endl; | ||
} | ||
try | ||
{ | ||
std::ofstream s2; | ||
s2.open("internal.dat", std::ios_base::in | std::ios_base::out | std::ios_base::binary); | ||
s2.exceptions(std::ios_base::failbit); | ||
} catch (const std::exception& e) { | ||
std::cerr << "ファイルを開けませんでした。" << std::endl; | ||
} | ||
} | ||
``` | ||
* std::ofstream[link /reference/fstream/basic_ofstream.md] | ||
* exceptions[link /reference/ios/basic_ios/exceptions.md] | ||
* open()[color ff0000] | ||
|
||
### 出力 | ||
``` | ||
ファイルを開けませんでした。 | ||
``` | ||
|
||
## バージョン | ||
### 言語 | ||
- C++98 | ||
- C++17: `std::filesystem::path`への対応 | ||
|
||
## 参照 | ||
|
||
- [LGW issue 2676. Provide filesystem::path overloads for File-based streams](https://wg21.cmeerw.net/lwg/issue2676) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# rdbuf | ||
* fstream[meta header] | ||
* std[meta namespace] | ||
* basic_ofstream[meta class] | ||
* function[meta id-type] | ||
|
||
```cpp | ||
basic_filebuf<CharT, Traits>* rdbuf() const; | ||
``` | ||
* basic_filebuf[link ../basic_filebuf.md] | ||
|
||
## 概要 | ||
ストリームバッファオブジェクトを取得する。 | ||
|
||
`basic_ofstream`は内部に`basic_filebuf`オブジェクトを保有しているため、基底クラス`basic_ios`の同名のメンバー関数と以下の点で異なる。 | ||
|
||
- 値を取得するための関数のみ存在する。これに対して、`basic_ios::rdbuf`関数では、値の取得・設定でオーバーロードされている。 | ||
- 戻り値の型が`basic_filebuf`へのポインタに変更されている。 | ||
|
||
## 戻り値 | ||
- `*this`が内部で保有しているストリームバッファ([`basic_filebuf`](../basic_filebuf.md))オブジェクトへのポインタ。 | ||
|
||
## 例 | ||
```cpp example | ||
#include <istream> // std::iostream用 | ||
#include <fstream> | ||
|
||
int main() | ||
{ | ||
std::ofstream fs("foo"); | ||
std::filebuf* buf = fs.rdbuf(); | ||
|
||
std::iostream ios(buf); // fs.rdbufで得たオブジェクトを元に、別のiostreamオブジェクトを構築。 | ||
int i; | ||
ios >> i; | ||
|
||
ios.seekg(0, std::ios_base::beg); | ||
ios << "ABC" << std::endl; | ||
} | ||
``` | ||
* std::filebuf[link ../basic_filebuf.md] | ||
* rdbuf()[color ff0000] | ||
* std::iostream[link ../../istream/basic_iostream.md] | ||
* seekg[link ../../istream/basic_istream/seekg.md] | ||
* std::ios_base[link ../../ios/ios_base.md] | ||
* beg[link ../../ios/ios_base/type-seekdir.md] | ||
|
||
## バージョン | ||
### 言語 | ||
- C++98 | ||
|
||
## 参照 | ||
- [`basic_ios::rdbuf`](../../ios/basic_ios/rdbuf.md): 基底クラスに存在する同名のメンバー関数。 |