Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lang/cpp11/string_literal_concatenation.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ int main()
std::wcout << s2 << std::endl;
}
```
* std::wcout[link /reference/iostream/cout.md]
* std::wcout[link /reference/iostream/wcout.md]

### 出力
```
Expand Down
2 changes: 1 addition & 1 deletion reference/ios/basic_ios/narrow.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ int main()
}
```
* narrow[color ff0000]
* std::wcout[link ../../iostream/wcout.md.nolink]
* std::wcout[link ../../iostream/wcout.md]

### 出力
```
Expand Down
8 changes: 4 additions & 4 deletions reference/ios/basic_ios/tie.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ basic_ostream<CharT, Traits>* tie(basic_ostream<CharT, Traits>* tiestr); // (
なお、この要件は「`tie` に設定した後でこのようになってはいけない」という意味であるものと思われる。(さもないと、設定したことによって無限ループが生じることを防げない)
- 標準入出力ストリームは、以下のような設定が行われている。
- [`cin`](../../iostream/cin.md)`.tie() == &`[`cout`](../../iostream/cout.md)
- [`wcin`](../../iostream/wcin.md.nolink)`.tie() == &`[`wcout`](../../iostream/wcout.md.nolink)
- [`wcin`](../../iostream/wcin.md)`.tie() == &`[`wcout`](../../iostream/wcout.md)
- [`cerr`](../../iostream/cerr.md)`.tie() == &`[`cout`](../../iostream/cout.md)(C++11 から)
- [`wcerr`](../../iostream/wcerr.md.nolink)`.tie() == &`[`wcout`](../../iostream/wcout.md.nolink)(C++11 から)
- [`wcerr`](../../iostream/wcerr.md.nolink)`.tie() == &`[`wcout`](../../iostream/wcout.md)(C++11 から)


## 例
Expand Down Expand Up @@ -101,8 +101,8 @@ new
- [`cin`](../../iostream/cin.md)
- [`cout`](../../iostream/cout.md)
- [`cerr`](../../iostream/cerr.md)
- [`wcin`](../../iostream/wcin.md.nolink)
- [`wcout`](../../iostream/wcout.md.nolink)
- [`wcin`](../../iostream/wcin.md)
- [`wcout`](../../iostream/wcout.md)
- [`wcerr`](../../iostream/wcerr.md.nolink)
- [`basic_istream`](../../istream/basic_istream.md)`::`[`sentry`](../../istream/basic_istream/sentry.md)`::`[`sentry`](../../istream/basic_istream/sentry/op_constructor.md)
- [`basic_ostream`](../../ostream/basic_ostream.md)`::`[`sentry`](../../ostream/basic_ostream/sentry.md)`::`[`sentry`](../../ostream/basic_ostream/sentry/op_constructor.md)
Expand Down
2 changes: 1 addition & 1 deletion reference/ios/basic_ios/widen.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ int main()
std::wcout << c1 << L", " << c2 << L'\n';
}
```
* std::wcout[link ../../iostream/wcout.md.nolink]
* std::wcout[link ../../iostream/wcout.md]
* widen[color ff0000]

### 出力
Expand Down
4 changes: 2 additions & 2 deletions reference/ios/ios_base/Init.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ namespace std {
- [`cout`](../../iostream/cout.md)
- [`cerr`](../../iostream/cerr.md)
- [`clog`](../../iostream/clog.md)
- [`wcin`](../../iostream/wcin.md.nolink)
- [`wcout`](../../iostream/wcout.md.nolink)
- [`wcin`](../../iostream/wcin.md)
- [`wcout`](../../iostream/wcout.md)
- [`wcerr`](../../iostream/wcerr.md.nolink)
- [`wclog`](../../iostream/wclog.md.nolink)
6 changes: 3 additions & 3 deletions reference/ios/ios_base/Init/op_constructor.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Init();

## 効果
`Init` クラスのオブジェクトを構築する。
[`cin`](../../../iostream/cin.md)、[`cout`](../../../iostream/cout.md)、[`cerr`](../../../iostream/cerr.md)、[`clog`](../../../iostream/clog.md)、[`wcin`](../../../iostream/wcin.md.nolink)、[`wcout`](../../../iostream/wcout.md.nolink)、[`wcerr`](../../../iostream/wcerr.md.nolink)、[`wclog`](../../../iostream/wclog.md.nolink) の 8 つのオブジェクトが構築・初期化されていなければ、それらの構築・初期化を行う。
[`cin`](../../../iostream/cin.md)、[`cout`](../../../iostream/cout.md)、[`cerr`](../../../iostream/cerr.md)、[`clog`](../../../iostream/clog.md)、[`wcin`](../../../iostream/wcin.md)、[`wcout`](../../../iostream/wcout.md)、[`wcerr`](../../../iostream/wcerr.md.nolink)、[`wclog`](../../../iostream/wclog.md.nolink) の 8 つのオブジェクトが構築・初期化されていなければ、それらの構築・初期化を行う。


## バージョン
Expand All @@ -34,7 +34,7 @@ Init();
- [`cout`](../../../iostream/cout.md)
- [`cerr`](../../../iostream/cerr.md)
- [`clog`](../../../iostream/clog.md)
- [`wcin`](../../../iostream/wcin.md.nolink)
- [`wcout`](../../../iostream/wcout.md.nolink)
- [`wcin`](../../../iostream/wcin.md)
- [`wcout`](../../../iostream/wcout.md)
- [`wcerr`](../../../iostream/wcerr.md.nolink)
- [`wclog`](../../../iostream/wclog.md.nolink)
4 changes: 2 additions & 2 deletions reference/ios/ios_base/Init/op_destructor.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

## 効果
`Init` クラスのオブジェクトを破棄する。
`Init` クラスのインスタンスが他に無かった場合、[`cout`](../../../iostream/cout.md)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`cerr`](../../../iostream/cerr.md)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`clog`](../../../iostream/clog.md)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`wcout`](../../../iostream/wcout.md.nolink)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`wcerr`](../../../iostream/wcerr.md.nolink)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`wclog`](../../../iostream/wclog.md.nolink)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()` を呼び出す。
`Init` クラスのインスタンスが他に無かった場合、[`cout`](../../../iostream/cout.md)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`cerr`](../../../iostream/cerr.md)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`clog`](../../../iostream/clog.md)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`wcout`](../../../iostream/wcout.md)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`wcerr`](../../../iostream/wcerr.md.nolink)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()`、[`wclog`](../../../iostream/wclog.md.nolink)`.`[`flush`](../../../ostream/basic_ostream/flush.md)`()` を呼び出す。


## バージョン
Expand All @@ -33,7 +33,7 @@
- [`cout`](../../../iostream/cout.md)
- [`cerr`](../../../iostream/cerr.md)
- [`clog`](../../../iostream/clog.md)
- [`wcout`](../../../iostream/wcout.md.nolink)
- [`wcout`](../../../iostream/wcout.md)
- [`wcerr`](../../../iostream/wcerr.md.nolink)
- [`wclog`](../../../iostream/wclog.md.nolink)
- [`basic_ostream`](../../../ostream/basic_ostream.md)`::`[`flush`](../../../ostream/basic_ostream/flush.md)
4 changes: 2 additions & 2 deletions reference/ios/ios_base/sync_with_stdio.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ int main()
- [`cout`](../../iostream/cout.md)
- [`cerr`](../../iostream/cerr.md)
- [`clog`](../../iostream/clog.md)
- [`wcin`](../../iostream/wcin.md.nolink)
- [`wcout`](../../iostream/wcout.md.nolink)
- [`wcin`](../../iostream/wcin.md)
- [`wcout`](../../iostream/wcout.md)
- [`wcerr`](../../iostream/wcerr.md.nolink)
- [`wclog`](../../iostream/wclog.md.nolink)
- C 言語ライブラリの標準ストリームオブジェクト
Expand Down
4 changes: 2 additions & 2 deletions reference/iostream.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
| [`cout`](iostream/cout.md) | マルチバイト文字による標準出力 | |
| [`clog`](iostream/clog.md) | マルチバイト文字による標準エラー出力 | |
| [`cerr`](iostream/cerr.md) | マルチバイト文字による標準エラー出力(バッファリング無し) | |
| [`wcin`](iostream/cin.md) | ワイド文字による標準入力 | |
| [`wcout`](iostream/cout.md) | ワイド文字による標準出力 | |
| [`wcin`](iostream/wcin.md) | ワイド文字による標準入力 | |
| [`wcout`](iostream/wcout.md) | ワイド文字による標準出力 | |
| [`wclog`](iostream/clog.md) | ワイド文字による標準エラー出力 | |
| [`wcerr`](iostream/cerr.md) | ワイド文字による標準エラー出力(バッファリング無し) | |
4 changes: 1 addition & 3 deletions reference/iostream/cin.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@
```cpp
namespace std {
extern istream cin;
extern wistream wcin;
}
```
* istream[link ../istream/basic_istream.md]
* wistream[link ../istream/basic_istream.md]

## 概要
`cin` は、標準入力に対する入力ストリームオブジェクトである。
Expand All @@ -20,7 +18,7 @@ namespace std {
本オブジェクトは、初期化が完了すると [`tie`](../ios/basic_ios/tie.md)`()` が `&`[`cout`](cout.md) を返すようになる。
その他の状態は、[`basic_ios`](../ios/basic_ios.md)`::`[`init`](../ios/basic_ios/init.md) の事後条件と同様である。

`cin`は`character input`を意味する。また`wcin`は`wide character input`を意味する。<sup><a id="cite_ref-1" href="#cite-1">[1]</a></sup>
`cin`は`character input`を意味する。

## 例
```cpp example
Expand Down
74 changes: 3 additions & 71 deletions reference/iostream/cout.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,17 @@
```cpp
namespace std {
extern ostream cout;
extern wostream wcout;
}
```
* ostream[link ../ostream/basic_ostream.md]
* wostream[link ../ostream/basic_ostream.md]
* ostream[link ../ostream/basic_ostream.md]

## 概要
`cout`も`wcout`も、標準出力に対する出力ストリームオブジェクトである。
`cout`、標準出力に対する出力ストリームオブジェクトである。

すなわち、[`std::basic_streambuf`](../streambuf/basic_streambuf.md)から派生していて`<cstdio>`の`stdout`オブジェクトに結びつけられているストリームバッファに出力する。

`cout`は`character output`を意味する。また`wcout`は`wide character output`を意味する。<sup><a id="cite_ref-1" href="#cite-1">[1]</a></sup>
`cout`は`character output`を意味する。

## 例
```cpp example
Expand All @@ -39,73 +38,6 @@ Hello world
### 言語
- C++98

### 備考

`wcout`は規格上実装しなければならないが、実装されていなかったり、期待どおりに動作しない事がある。

#### localeの設定
望む出力を得るためにlocaleを再設定しなければならない場合がある。

例えばVisual Studioでは

```cpp example
#include <iostream>

int main()
{
std::wcout.imbue(std::locale(""));
//std::wcout.imbue(std::locale("ja"));
//std::wcout.imbue(std::locale("japanese"));
std::wcout << L"ありきたりな世界" << std::endl;
}
```
* std::wcout[color ff0000]
* imbue[link /reference/ios/basic_ios/imbue.md]

のようにして設定しないと何も表示されない。

`std::locale("")`とすると本来はOSに設定されたロケールが設定されるはずが、MinGW環境でコンパイルし実行すると、以下のようなエラーが出力されてしまう。

```
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
```

一方、以下のようなコードなら求める結果が得られる処理系もある。

```cpp example
#include <iostream>

int main()
{
std::ios_base::sync_with_stdio(false);
std::locale default_loc("");
std::locale::global(default_loc);
std::locale ctype_default(std::locale::classic(), default_loc, std::locale::ctype); //※
std::wcout.imbue(ctype_default);
std::wcout << L"ありきたりな世界" << std::endl;
}
```
* std::wcout[color ff0000]
* imbue[link /reference/ios/basic_ios/imbue.md]

このように求める結果を得るためのlocaleの設定は処理系によって大きく異なる。

#### 端末のロケールやフォントなど

`wcout`を使ったとしても、結局`stdout`に出力するので、その標準出力を受け取って表示する端末のロケールやフォントなどの設定も考える必要がある。

##### Windows
Windowsでは`wchar_t`型といえばUTF-16でエンコードされた文字を指す。もし標準出力を受け取って表示するコンソールのロケールがUTF-8(65001)であるならばUTF-16からUTF-8への変換は一対一対応するため変換段階において問題は起きない。

しかしながらデフォルトのロケールがUTF-8(65001)ではない事が多い(日本語利用者なら932になっている事が多い)ため、そのロケールで対応していないUnicodeコードポイントは当然変換できないので文字化けする。`chcp 65001`などでUTF-8にすることができる。

こうしてUTF-8としてコンソールが文字列を受け取ったとしてもそれを正しく表示できるとは限らない。まずフォントが表示したい文字をすべて含んでいなければならない。またそうしたフォントを使えるようになっていなければならない。Windows10 1709より前では、ロケールをUTF-8にしたときのフォントの指定に制約があり、実質日本語を表示することは不可能だった。次に、🍣🍺のような色のついた絵文字を表示するためには、フォントの対応に加えて、それをDirectWriteなどを用いて描画されることが前提となる。例えばコマンドプロンプトはGDIで描画するため原理上不可能である。Microsoftが開発している[Windows Terminal](https://github.com/microsoft/terminal)ではこうした描画側の問題を克服しようとしている。

## 出典

1. **<a id="cite-1" href="#cite_ref-1">^</a>** <cite>[Stroustrup: C++ Style and Technique FAQ](http://www.stroustrup.com/bs_faq2.html#cout)</cite>(2018-08-21 17:01 JST 閲覧)

## 参照

- [使用できるロケール文字列](../../article/platform/locales.md)
Expand Down
53 changes: 53 additions & 0 deletions reference/iostream/wcin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# wcin
* iostream[meta header]
* std[meta namespace]
* variable[meta id-type]

```cpp
namespace std {
extern wistream wcin;
}
```
* wistream[link ../istream/basic_istream.md]

## 概要
`wcin` は、標準入力に対するワイド文字用の入力ストリームオブジェクトである。

すなわち、[`std::basic_streambuf`](../streambuf/basic_streambuf.md)から派生していて`<cstdio>`の`stdin`オブジェクトに結びつけられているストリームバッファから入力を受ける。

本オブジェクトは、初期化が完了すると [`tie`](../ios/basic_ios/tie.md)`()` が `&`[`wcout`](wcout.md) を返すようになる。
その他の状態は、[`basic_ios`](../ios/basic_ios.md)`::`[`init`](../ios/basic_ios/init.md) の事後条件と同様である。

`wcin`は`wide character input`を意味する。<sup><a id="cite_ref-1" href="#cite-1">[1]</a></sup>

## 例
```cpp example
#include <iostream>
#include <string>

int main()
{
std::wcout << L"名前を入力してください: ";

std::wstring s; // std::wcin.tie() == &std::wcout であるため、
std::wcin >> s; // std::wcout を明示的に flush しなくても
// 上記の出力が flush されることが保証されている

std::wcout << L"あなたの名前は「" << s << L"」ですね。" << std::endl;
}
```
* std::wcin[color ff0000]

### 出力例
```
名前を入力してください:たろう
あなたの名前は「たろう」ですね
```

## バージョン
### 言語
- C++98

## 出典

1. **<a id="cite-1" href="#cite_ref-1">^</a>** <cite>[Stroustrup: C++ Style and Technique FAQ](http://www.stroustrup.com/bs_faq2.html#cout)</cite>(2018-08-21 17:01 JST 閲覧)
Loading
Loading