web-dev-qa-db-ja.com

C#でReadBlockメソッドを使用しているときに、ファイルの最後に達したことを確認するにはどうすればよいですか?

同じ読み込み文字が何度も返されることに気づきましたが、もっとエレガントな方法があるのではないかと思っていました。

23
abw333
while(!streamReader.EndOfStream)
{
    string line = streamReader.ReadLine();
    Console.WriteLine(line);
}
Console.WriteLine("End of File");
49
harryovers

チェック StreamReader.EndOfStream 。これがtrueのときに読み取りループを停止します。

ReadBlockの呼び出しでも、コードが「読み取ったバイト数」の戻り値を正しく処理することを確認してください。ゼロバイトの読み取りが表示されているように聞こえますが、変更されていないバッファーの内容が同じデータの別の読み取りであると想定しているだけです。

4
Steve Townsend

残念ながら、まだ回答についてコメントすることはできませんが、「The Moof」の回答には...

curパラメータは、書き込みを開始するindexのインデックス用であるため、ここでのbufferの使用は間違っています。したがって、例では、0の呼び出しでstream.ReadBlockに置き換える必要があります。

2
PL-Li2

返された読み取りの長さが要求された読み取りの長さよりも短い場合は、終わりです。また、ストリームサイズがバッファーサイズに完全に一致しない場合に備えて、読み取りの長さを追跡する必要があります。そのため、バッファー内のデータの短い長さを考慮する必要があります。

do{
     len = stream.ReadBlock(buffer, 0, buffer.Length);
     /* ... */
  }while(len == buffer.Length);

ループ条件でストリームのEndOfStreamフラグを確認することもできます。 「0」の長さの読み取りを行わないため、この方法をお勧めします(まれな条件ですが、発生する可能性があります)。

do{
      len = stream.ReadBlock(buffer, 0, buffer.Length);
      /* ... */
  }while(!stream.EndOfStream);
2
The Moof

From [〜#〜] msdn [〜#〜] for ReadBlock()

戻り値の型:System.Int32基になるストリームの位置は、バッファーに読み込まれた文字数だけ進みます。読み込まれた文字数。数値は、すべての入力文字が読み取られたかどうかに応じて、count以下になります。

したがって、EOFが0を返す場合、

1
Bala R