我注意到它会一遍又一遍地返回相同的读取字符,但我想知道是否有更优雅的方式。
问问题
56409 次
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
不幸的是,我还不能评论答案,但对“The Moof”的答案......
您对cur
此处的使用放错了位置,因为该index
参数用于buffer
开始写入的索引。因此,对于您的示例,它应该0
在调用中替换为stream.ReadBlock
.
于 2013-10-16T14:42:40.117 回答
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 回答
1
来自MSDNReadBlock()
:_
返回值 类型:System.Int32 底层流的位置提前读入缓冲区的字符数。已读取的字符数。该数字将小于或等于 count,具体取决于是否已读取所有输入字符。
所以我会假设它返回 0 时是 EOF,
于 2011-06-23T13:57:35.937 回答