次のようなwhileループを使用してファイルを読み取ることができるのはなぜですか
while (file >> variable)
または
while (getline(xx, yy))
>>
およびgetline
関数はブール値を返しますか?
次のようなwhileループを使用してファイルを読み取ることができるのはなぜですか
while (file >> variable)
または
while (getline(xx, yy))
>>
およびgetline
関数はブール値を返しますか?
ストリーム演算子は、ストリーム自体への参照として評価されます。これにより、連鎖が可能になりますfile >> variable >> variable >> variable
。
ストリーム オブジェクトがブール値 (true
エラー フラグが設定されていない場合の値) に変換可能であるという事実と組み合わせると、はい、その効果が得られます。
次のようなものがある場合:
データを含むファイル:
11
22
13
45
19
次に、C++ ファイル:
int variable;
int count = 0;
while(!file.eof())
{
count ++;
file >> variable;
}
cout << "there are " << count << " numbers in the file";
19 を読み取ると eof が false になり、NEXT 番号を読み取ろうとするときにのみ eof が設定されるため、この出力は 6 になります。count++ を if ステートメントに移動することでこれを修正できるので、if (file >> variable) count++;
代わりに使用します。しかし、それはかなり不器用になります。
代わりに次のようにします。
while(file >> variable)
{
count++;
}
19 の次の数字を読み取ろうとすると、ループが終了します。
編集:「失敗した読み取り」の後に eof() が設定されていることを明確にするために、「間違っている理由」を修正します。
while(!file.eof())
また、が不適切な入力ではうまく機能しないことも指摘しておく必要があります。上記のコードがあるとしますが、入力が11 22 aa ...
- 入力が の場合、 eof() は設定されませんaa
。入力が停止し、エラーが返されます。しかし、eof() はまだ false であるため [技術的には、数値として読み取ろうとしない限り、ファイルからさらに読み取ることができます]。したがって、これは無限ループにつながります。解決策はこのwhile (file >> variable)
問題を回避します - もちろん、「ここに数字が必要だったのに、何か他のものを手に入れた」というコードを追加する必要があるかもしれません。しかし、ループが永遠に続くことを心配する必要はありません。
便宜上、そうする場合もあります。または、bool にキャスト可能な型を返します。これらの関数 (またはストリーム演算子) のドキュメントを参照してください。