C# - 流/文件流 EOF

发布于 2024-10-17 15:59:57 字数 91 浏览 3 评论 0原文

有谁熟悉如何找出您位于文件末尾的方法吗? 我正在使用 BinaryReader 并尝试了 PeekChar - 但它引发了异常。还有其他建议吗?

谢谢。

Is anyone familiar with a way to find out you're at the end of the file?
I'm using BinaryReader and tried PeekChar - but it throws an exception. Any other suggestions?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

娜些时光,永不杰束 2024-10-24 15:59:57

Stream中,如果您Read(buffer, offset, count),您将得到一个非正结果,如果您Peek() > 你会得到一个负面的结果。

使用 BinaryReader文档 建议 PeekChar() 应返回负数:

返回值

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

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

From a Stream, if you Read(buffer, offset, count) you'll get a non-positive result, and if you Peek() you'll get a negative result.

With a BinaryReader, the documentation suggests that PeekChar() should return negative:

Return Value

Type: System.Int32
The next available character, or -1 if no more characters are available or the stream does not support seeking.

are you sure this isn't a corrupt stream? i.e. the remaining data cannot form a complete char from the given encoding?

半山落雨半山空 2024-10-24 15:59:57

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

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

If your stream supports seeking (check this using the BaseStream.CanSeek property), check the Position property of the BaseStream, like so:

if (myBinaryReader.BaseStream.CanSeek){
   bool atEnd = (myBinaryReader.BaseStream.Position == myBinaryReader.BaseStream.Length - 1)
}
潦草背影 2024-10-24 15:59:57

检查读取器的位置是否小于其长度就可以了

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

Checking whether the position of the reader is less than its length does the trick

While BinReader.Position < BinReader.Length
{
 ... BinReader.Read() ...
}
莫言歌 2024-10-24 15:59:57

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

I'll add my suggestion: if you don't need the "encoding" part of the BinaryReader (so you don't use the various ReadChar/ReadChars/ReadString) then you can use an encoder that won't ever throw and that is always one-byte-per-char. Encoding.GetEncoding("iso-8859-1") is perfect for this. The iso-8859-1 encoding is a one-byte-per-character encoding that maps 1:1 all the first 256 characters of Unicode (so the byte 254 is the char 254 for example)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文