当我';在C#中使用ReadBlock方法时,ve已到达文件末尾
本文关键字:ve 文件 方法 ReadBlock 当我 | 更新日期: 2023-09-27 18:00:02
我注意到它会一次又一次地返回相同的读取字符,但我想知道是否有更优雅的方法。
while(!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
Console.WriteLine(line);
}
Console.WriteLine("End of File");
检查StreamReader.EndOfStream。当这是true
时,停止读取循环。
确保您的代码在ReadBlock
调用中也正确处理了"byte count just-read"的返回值。听起来你看到的是零字节的读取,只是假设你看到的未更改的缓冲区内容是对相同数据的另一次读取。
不幸的是,我还不能对答案发表评论,但对"Moof"的答案。。。
这里使用cur
是错误的,因为index
参数用于buffer
中开始写入的索引。因此,对于您的示例,在对stream.ReadBlock
的调用中应该将其替换为0
。
当返回的读取长度小于您请求的读取长度时,您处于末尾。您还应该跟踪读取长度,以防流大小与缓冲区大小不完全匹配,因此需要考虑缓冲区中数据的较短长度。
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);
来自MSDN for ReadBlock()
:
返回值类型:System.Int32底层流的位置为按字符数前进被读入缓冲区的。数字已读取的字符数。这个数字将小于或等于计数,取决于是否所有输入已读取个字符。
所以我假设当它返回0时是EOF,