同じ読み取り文字が何度も返されることに気づきましたが、もっとエレガントな方法があるのではないかと思いました。
5 に答える
while(!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
Console.WriteLine(line);
}
Console.WriteLine("End of File");
StreamReader.EndOfStreamを確認してください。これがの場合、読み取りループを停止しますtrue
。
ReadBlock
コードが呼び出しでも「読み取ったばかりのバイト数」の戻り値を正しく処理することを確認してください。ゼロバイトが読み取られているように聞こえますが、表示されている変更されていないバッファの内容が同じデータの別の読み取りであると想定しています。
返された読み取り長が要求された読み取り長よりも短い場合、最後になります。また、ストリームサイズがバッファサイズと完全に一致しない場合に備えて、読み取り長を追跡する必要があります。そのため、バッファ内のデータの長さが短いことを考慮する必要があります。
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);
残念ながら、まだ回答にはコメントできませんが、「TheMoof」による回答には...
パラメータは書き込みを開始するインデックス用であるため、ここでの使用cur
は見当違いです。したがって、例では、の呼び出しでに置き換える必要があります。index
buffer
0
stream.ReadBlock
MSDNからReadBlock()
:_
戻り値タイプ:System.Int32基になるストリームの位置は、バッファーに読み込まれた文字数だけ進められます。読み取られた文字数。すべての入力文字が読み取られたかどうかに応じて、数値はカウント以下になります。
したがって、0を返すときはEOFであると想定します。