同じ読み込み文字が何度も返されることに気づきましたが、もっとエレガントな方法があるのではないかと思っていました。
while(!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
Console.WriteLine(line);
}
Console.WriteLine("End of File");
チェック StreamReader.EndOfStream 。これがtrue
のときに読み取りループを停止します。
ReadBlock
の呼び出しでも、コードが「読み取ったバイト数」の戻り値を正しく処理することを確認してください。ゼロバイトの読み取りが表示されているように聞こえますが、変更されていないバッファーの内容が同じデータの別の読み取りであると想定しているだけです。
残念ながら、まだ回答についてコメントすることはできませんが、「The Moof」の回答には...
cur
パラメータは、書き込みを開始するindex
のインデックス用であるため、ここでのbuffer
の使用は間違っています。したがって、例では、0
の呼び出しでstream.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);
From [〜#〜] msdn [〜#〜] for ReadBlock()
:
戻り値の型:System.Int32基になるストリームの位置は、バッファーに読み込まれた文字数だけ進みます。読み込まれた文字数。数値は、すべての入力文字が読み取られたかどうかに応じて、count以下になります。
したがって、EOFが0を返す場合、