在C#中使用ReadBlock方法时,如何知道何时到达文件末尾?

时间:2011-06-23 13:52:27

标签: c# streamreader readblock

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

5 个答案:

答案 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,