【发布时间】:2021-09-19 02:12:47
【问题描述】:
这是我的问题:我必须读取“二进制”文件,即具有不同“记录”大小并且可能包含二进制数据以及 UTF-8 编码的文本字段的文件。
从输入文件中读取给定数量的字节是微不足道的,但我想知道是否有函数可以轻松地从文件中读取给定数量的字符(不是字节)?比如,如果我知道我需要读取一个 10 个字符的字段(以 UTF-8 编码,它会至少 10 个字节长,但如果我们是谈论“高”代码点)。
我强调我正在读取一个“混合”文件,也就是说,我不能将其全部作为 UTF-8 处理,因为必须读取二进制字段而不被解释为 UTF-8 字符。
因此,虽然手工操作非常简单(逐字节、幼稚的方法并不难实现——尽管我对效率持怀疑态度),但我想知道是否有更好的方法那里的替代品。如果可能的话,在标准库中,但我也对第 3 方代码持开放态度 - 如果我的组织验证了它的使用。
【问题讨论】:
-
确实需要更详细的二进制文件格式。文本字段是固定宽度还是可变长度,带有长度指示符或空终止符?我认为让二进制文件在 Unicode 代码点中指示宽度是不好的设计。
-
你为什么不
mmap文件?然后,您可以轻松地将 UTF8 的 byte-at-a-time 和以后的二进制交换 这是读取文件的最快方式。看我的回答:stackoverflow.com/questions/33616284/… -
This old question(在右侧边栏中的“相关”下建议)看起来正是您想要做的。
-
请注意,使用 MSVC 时 getwc 无法返回完整的 Unicode 代码点。 MSVC 的 wint_t 是一个无符号短字符,因此如果您的数据实际上包含非 BMP 字符,那么您将得到最好的代理(我还没有确认这是否真的有效,或者它是否会产生某种错误)。跨度>
-
“二进制字段”是什么意思?是什么界定了这些领域? UTF-8 有一个相当固定的模式:任何具有 C/D/E/F 高 4 位的“新”字节都是 2/3/4 字节字符序列的第一个字节,等等。现在未知的是你的“二进制”数据。