## 7.5 書式設定入力

基本的に、入出力演算子は対称的に機能します。主な違いは 1 つだけです。出力の場合は、挿入する文字シーケンスの厳密な書式を制御することができます。これに対して入力の場合は、抽出する文字シーケンスを厳密に記述することはありません。これは現実的な理由によるものです。たとえば、ストリームから次の小数点値を抽出する場合、符号付きかどうか、小文字の e または大文字の E を使用した指数表記かどうかなど、その厳密な書式が必ずしも事前に分かるわけではありません。したがって、抽出子は、許容範囲内であればどのような書式の項目でも受け入れます。

書式設定入力の処理方法は次のとおりです。

1. 抽出する項目の先頭の空白文字 (空白、タビュレータ、復帰改行5) は、抽出子では自動的に無視されます。
2. 最初の対象文字が見つかると、区切り文字が見つかるまで入力ストリームから文字を抽出します。区切り文字とは項目に含まれない文字のことで、空白文字がその代表です。
3. 区切り文字は入力ストリームに残り、次の抽出では、空白文字が最初に抽出される文字になります。

挿入を制御する書式パラメータの中には、抽出に関係ないものがあります。書式パラメータ空白詰め文字の `fill()` と、文字揃えフラグの `left、right、internal` は抽出には関係ありません。文字列の抽出に関係のあるのはフィールド幅だけであり、その他はすべて無視されます。

### 7.5.1 文字のスキップ

マニピュレータ `noskipws` は、空白文字の自動的なスキップの機能をオフにします。たとえば、一定の書式の入力が必要なときに、書式条件に合致しない箇所を確認する必要がある場合は、空白文字の抽出が必要です。次のコードで、この手順を示します。

>     cin >> noskipws;
>     char c;
>     do
>     { float fl;
>       c = ' '; cin >> fl >> c;  // 数値と区切り文字を抽出する
>     if (c == ',' || c == '\n')  // 次の char は ',' または復帰改行か
>         process(fl);            // yes: その数値を使用する
>     }
>     while (c == ',');
>     if (c != '\n') error();     // no: エラー !

空白以外の文字シーケンスをスキップする必要がある場合、入出力ストリームのメンバー関数 `ignore()` を使用します。呼び出しは次のとおりです。

>     basic_ifstream<myChar,myTraits> InputStream("file-name");
>     InputStream.ignore(numeric_limits<streamsize>::max()
>                       ,myChar('\n'));

または、型が `char` の通常の 1 バイト文字の場合、

>     ifstream InputStream("file-name");
>     InputStream.ignore(INT_MAX,'\n');

行末まですべての文字が無視されます。この例では、組み込みストリーム以外のファイルストリームを使用します。ファイルストリームについては、6.4.1.5 節を参照してください。

### 7.5.2 文字列の入力

入力ストリームから文字列や文字の配列を抽出するときは、次の条件になるまで文字が読み取られます。

- 空白文字が見つかるまで
- 入力の最後の位置に到達するまで
- `width() != 0`: の場合は、一定の文字数が抽出されるまで。 文字列の場合は、この値はフィールド幅 `width()` を表します。文字配列の場合は、この値は `width()-1` です。

文字列の抽出後は、フィールド幅は `0` にリセットされます。

文字列シーケンスを文字列配列に抽出することと、文字列オブジェクトに抽出することの間には微妙な違いがあります。次にその例を示します。

>     char buf[SZ];
>     cin >> buf;

は次のコードとは異なります。

>     string s;
>     cin >> s;

文字列は必要に応じて自動的に容量を広げるため、文字列に抽出するのは問題ありません。文字列は、常に必要に応じてサイズを自動的に調整するため、必要なだけの文字を抽出することができます。ただし、文字配列はサイズが固定されており、動的に容量を広げることはできません。文字配列の容量以上に文字を抽出すると、配列の最後を過ぎても抽出子による書き込みは終了しません。これを防ぐには、文字配列に文字を抽出するたびに、次のようにフィールド幅を設定する必要があります。

>     char buf[SZ];
>     cin >> width(SZ) >> buf;

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

OEM リリース, 1998 年 6 月