我注意到它会一遍又一遍地返回相同的读取字符,但我想知道是否有更优雅的方式。
答案 0 :(得分:45)
while(!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
Console.WriteLine(line);
}
Console.WriteLine("End of File");
答案 1 :(得分:4)
检查StreamReader.EndOfStream。如果是true
,请停止读取循环。
确保您的代码正确处理ReadBlock
调用中“仅读取字节数”的返回值。听起来你看到零字节读取,只是假设你看到的未更改的缓冲区内容是对同一数据的另一次读取。
答案 2 :(得分: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);
答案 3 :(得分:2)
不幸的是我还没有对答案发表评论,而是对“The Moof”的回答......
您在此使用cur
是错误的,因为index
参数适用于buffer
中要开始写作的索引。因此,对于您的示例,应在0
的调用中将其替换为stream.ReadBlock
。
答案 4 :(得分:1)
来自ReadBlock()
的{{1}}:
返回值类型:System.Int32 底层流的位置是 按字符数增加 被读入缓冲区的。数字 已阅读的字符数。该 数字将小于或等于 计数,取决于是否所有输入 字符已被阅读。
所以当它返回0时我会假设它是EOF,