当我';在C#中使用ReadBlock方法时,ve已到达文件末尾

本文关键字:ve 文件 方法 ReadBlock 当我 | 更新日期: 2023-09-27 18:00:02

我注意到它会一次又一次地返回相同的读取字符,但我想知道是否有更优雅的方法。

当我';在C#中使用ReadBlock方法时,ve已到达文件末尾

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,