Skip to content

Commit

Permalink
feat(basic_ofstream): add basic_ofstream
Browse files Browse the repository at this point in the history
  • Loading branch information
yumetodo committed Dec 14, 2019
1 parent 0c9e10c commit 84d4258
Show file tree
Hide file tree
Showing 6 changed files with 369 additions and 0 deletions.
52 changes: 52 additions & 0 deletions reference/fstream/basic_ofstream.md
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` | |
44 changes: 44 additions & 0 deletions reference/fstream/basic_ofstream/close.md
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
44 changes: 44 additions & 0 deletions reference/fstream/basic_ofstream/is_open.md
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
102 changes: 102 additions & 0 deletions reference/fstream/basic_ofstream/op_constructor.md
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)
74 changes: 74 additions & 0 deletions reference/fstream/basic_ofstream/open.md
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)
53 changes: 53 additions & 0 deletions reference/fstream/basic_ofstream/rdbuf.md
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): 基底クラスに存在する同名のメンバー関数。

0 comments on commit 84d4258

Please sign in to comment.