25

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

4

5 に答える 5

54
while(!streamReader.EndOfStream)
{
    string line = streamReader.ReadLine();
    Console.WriteLine(line);
}
Console.WriteLine("End of File");
于 2011-06-23T13:57:02.443 に答える
5

StreamReader.EndOfStreamを確認してください。これがの場合、読み取りループを停止しますtrue

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

于 2011-06-23T13:54:09.227 に答える
2

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

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);
于 2011-06-23T14:11:10.577 に答える
2

残念ながら、まだ回答にはコメントできませんが、「TheMoof」による回答には...

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

于 2013-10-16T14:42:40.117 に答える
1

MSDNからReadBlock():_

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

したがって、0を返すときはEOFであると想定します。

于 2011-06-23T13:57:35.937 に答える