5

次のようなwhileループを使用してファイルを読み取ることができるのはなぜですか

while (file >> variable)

または

while (getline(xx, yy))

>>およびgetline関数はブール値を返しますか?

4

3 に答える 3

8

ストリーム演算子は、ストリーム自体への参照として評価されます。これにより、連鎖が可能になりますfile >> variable >> variable >> variable

ストリーム オブジェクトがブール値 (trueエラー フラグが設定されていない場合の値) に変換可能であるという事実と組み合わせると、はい、その効果が得られます。

于 2012-12-23T09:01:57.193 に答える
3

次のようなものがある場合:

データを含むファイル:

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)問題を回避します - もちろん、「ここに数字が必要だったのに、何か他のものを手に入れた」というコードを追加する必要があるかもしれません。しかし、ループが永遠に続くことを心配する必要はありません。

于 2012-12-23T10:34:23.023 に答える
0

便宜上、そうする場合もあります。または、bool にキャスト可能な型を返します。これらの関数 (またはストリーム演算子) のドキュメントを参照してください。

于 2012-12-23T08:56:26.340 に答える