【问题标题】:C# - Stream/FileStream EOFC# - 流/文件流 EOF
【发布时间】:2011-02-16 12:27:06
【问题描述】:

有没有人熟悉一种方法来找出你在文件的末尾? 我正在使用 BinaryReader 并尝试了 PeekChar - 但它引发了异常。还有其他建议吗?

谢谢。

【问题讨论】:

  • 您希望它仅适用于文件(我认为是可搜索的)还是一般的流?
  • 抛出什么异常?
  • 输出字符缓冲区太小,无法包含解码的字符,编码为 'Unicode (UTF-8)' fallback 'System.Text.DecoderReplacementFallback'。参数名称:字符

标签: c# stream eof


【解决方案1】:

来自Stream,如果您Read(buffer, offset, count),您将得到非阳性结果,如果您Peek(),您将获得阴性结果。

使用BinaryReader,the documentation 建议PeekChar() 应该返回负数:

返回值

类型:System.Int32 下一个可用字符,如果没有更多可用字符或流不支持查找,则为 -1。

您确定这不是 损坏的 流吗?即剩余数据不能从给定的编码形成完整的char?

【讨论】:

  • 我已经完成了 while (binReader.PeekChar() ! = -1 ) {...} 这就是我得到的:输出字符缓冲区太小,无法包含解码的字符,编码' Unicode (UTF-8)' 后备 'System.Text.DecoderReplacementFallback'。参数名称:字符
  • @MarcGravell DecoderReplacementFallback 中的某处可能存在错误/功能,因此new BinaryReader(new MemoryStream(new byte[] { 194, 0, 0 })).PeekChar() 将抛出异常(并非所有三个字节的非法序列都会抛出......例如@987654330 @不会
【解决方案2】:

如果您的流支持搜索(使用 BaseStream.CanSeek 属性检查),请检查 BaseStream 的 Position 属性,如下所示:

if (myBinaryReader.BaseStream.CanSeek){
   bool atEnd = (myBinaryReader.BaseStream.Position == myBinaryReader.BaseStream.Length - 1)
}

【讨论】:

    【解决方案3】:

    检查阅读器的位置是否小于它的长度是诀窍

    While BinReader.Position < BinReader.Length
    {
     ... BinReader.Read() ...
    }
    

    【讨论】:

    • 使用Stream.Position或Stream.Length如果CanSeek == false会导致异常。
    【解决方案4】:

    我将添加我的建议:如果您不需要BinaryReader 的“编码”部分(因此您不使用各种ReadChar/ReadChars/ReadString)那么您可以使用永远不会抛出的编码器,并且始终为每个字符一个字节。 Encoding.GetEncoding("iso-8859-1") 非常适合这个。 iso-8859-1 编码是每个字符一个字节的编码,它以 1:1 的比例映射 Unicode 的所有前 256 个字符(因此 byte 254 是 char 254 例如)

    【讨论】:

      【解决方案5】:
      While BinReader.PeekChar() > 0
      {
      ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-11
        • 1970-01-01
        • 2011-11-05
        • 2013-12-02
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-03
        相关资源
        最近更新 更多