フォーマットされた入力関数は非常に単純に機能します。
- 先頭の空白がある場合はスキップします。
- 彼らは与えられたタイプに一致するフォーマットを読み込もうとします。
- データが必要な形式と一致しないために値の読み取りに失敗した場合は、を設定し
std::ios_base::failbit
ます。読み取りに失敗した場合、入力は読み取ろうとした変数を変更しないでください(標準の入力演算子はこの規則に従いますが、ユーザー定義の入力演算子は変更しない場合があります)。
読み込もうとする最初の値はですint
。読み取りint
とは、オプションの先行記号が読み取られ、その後に一連の数字が続くことを意味します(設定と指定された値に応じて、ストリームは10進数ではなく8進数または16進数を読み取る場合があります)。つまり、はint
値3
を受け取り、読み取りはの直前で停止し.
ます。
次に読む内容に応じて、次の読み取りが失敗するか、失敗します。
- 最初のコードでは、オプションの符号で始まり、オプションの整数部分、オプションの千の区切り記号、オプションの小数部分、オプションの指数が続く浮動小数点値を読み取ろうとします。整数部分または小数部分のいずれかに少なくとも1桁が必要です。あなたの例では、数千の個別の部分とそれに続く小数部分しかありません。
- 整数を読み込もうとすると、
.
anの有効な部分ではないaが見つかりint
、読み取りに失敗します。
値の読み取りを試みた後は、読み取り操作が成功したかどうかを常に試行し、潜在的なエラーを報告する必要があります。
if (in >> value) {
std::cout << "successfully read '" << value << "'\n";
}
else {
std::cerr << "failed to read a value from input\n";
}
読み取りに失敗した後は、たとえば、を使用してクリーンアップする必要がある場合があることに注意してください。
in.clear();
in.ignore();
これにより、最初にエラーフラグがクリアされ(これがないと、ストリームはデータを読み取ろうとする試みをすべて無視します)、次に次の文字を無視します。