## 6.2 標準入出力ストリームのはたらき

標準入出力ストリームの主な目的は、データの入出力ツールとして使用することです。一般に入出力とは、図 17 にあるように、プログラムと任意の外部デバイスとの間のデータの転送を指します。

#### 図 17 -- 入出力ストリームでサポートするデータ転送

このようなデータの内部表現は、プログラム内での処理の容易さを優先したものになります。反対に外部表現では、処理の容易さを優先していません。人間が読むことのできる形式や、移植性のあるデータ交換用の形式にすることが目的になります。記憶スペースの節約など、表現の意図も無視できません。

テキスト入出力には、文字シーケンスの外部表現も関係します。文字シーケンスでなければバイナリ入出力の外部表現が関係します。基本的には、入出力ストリームはテキスト処理、すなわち書式設定とコード変換に使用されています。

書式設定は、内部データ表現のバイトシーケンスから、人間が読むことのできる文字シーケンスに変換する処理です。たとえば、変数内の浮動小数点形式や整数値を 10 進数に変換します。図 18 は書式設定のプロセスを示したものです。

#### 図 18 -- プログラムデータの書式設定

コードの変換は、文字表現を別の表現に変換するプロセスです。たとえば、内部表現のワイド文字から外部表現の複数バイト文字シーケンスに変換します。ワイド文字はすべて同じサイズなので、内部データの処理に便利です。複数バイト文字のサイズはさまざまであり、よりコンパクトに記憶することができます。一般には、データの転送やファイルなど外部デバイスによる記憶に使用します。図 19 は変換プロセスを示したものです。

#### 図 19 -- 複数バイト文字とワイド文字間のデータ変換

### 6.2.1 入出力ストリーム層

入出力機能には、書式設定を処理する層と、コード変換と外部デバイスとの間で文字の移送を処理する層の 2 つの層があります。図 20 に示すように、層間の通信はバッファを通じて行われます。

#### 図 20 -- 入出力ストリーム層

次の節では、それぞれの層の機能を詳しく説明します。

#### 6.2.1.1 書式設定層

この層では、プログラムの内部データ表現と、文字シーケンスとして人間が読むことのできる表現間の変換が行われます。この書式設定と構文解析に関係のある主な項目は、次のとおりです。

- 浮動小数点数の精度と表記
- 整数の 16 進、8 進、10 進表記
- 入力の空白のスキップ
- 出力のフィールド幅
- 数字書式への地域の規約の適用

#### 6.2.1.2 移送 (トランスポート) 層

この層では、文字の生成と消費が行われます。特定の外部デバイスのプロパティに関する情報がカプセル化されています。関係のある主な項目は、次のとおりです。

- システム呼び出しによるファイルへのブロック単位出力
- 複数バイト符号化へのコード変換
  外部デバイスへのアクセスを減らすためには、バッファを使用します。出力時には、書式設定層から移送層に文字シーケンスが転送され、ここではストリームバッファに保存されます。外部デバイスに対する実際の移送は、バッファが一杯になるか、明示的にフラッシュしたときにだけ行われます。入力時には、外部デバイスから文字が移送層に読み込まれ、バッファに転送されます。書式設定層では、バッファから文字を受け取ります。バッファが空になると、移送層から文字が転送されます。

#### 6.2.1.3 ロケール

書式設定層と移送層のどちらもストリームのロケールを使用します。書式設定層では、ロケールの数値ファセットに数値エンティティの処理を委託します。移送層では、バッファの内容と外部デバイスとの間で移送される文字との間の文字ごとの変換に、ロケールのコード変換ファセットを使用します。図 21 は入出力ストリームにおけるロケールの使用方法を示したものです。

#### 図 21 -- 入出力ストリームにおけるロケールの使用

### 6.2.2 ファイル入出力とメモリー内入出力

入出力ストリームでは、ファイル入出力とメモリー内入出力という 2 種類の入出力をサポートしています。

ファイル入出力では、外部デバイスとの間でデータを移送します。デバイスは、必ずしも、一般的な意味でのファイルでなくても構いません。デバイスは、通信チャンネルのこともあり、ファイルの概念に沿ったその他の構造も該当します。

これに対して、メモリー内入出力には外部デバイスは関与しません。したがって、コードの変換と移送は必要ではありません。行われるのは書式設定だけであり、その結果はメモリー内に保存され、文字列の形式で検索することができます。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。

OEM リリース, 1998 年 6 月