我正在将浮点数写入文件,但是有两种不同的方式写入这些数字,我想知道该使用哪种方式。
两种选择是:
选项1似乎对我来说更实用,因为我将每个float都截断为4个字节。阅读时可以完全跳过解析每个数字的操作。但实际上,我只见过使用选项2。
有问题的数据是3D模型信息,在这种情况下,较小的文件大小和快速读取可能会非常有优势,但是同样,据我所知,没有任何现有的3D模型格式可以做到这一点,并且我想背后必须有充分的理由。
我的问题是,选择书写数字形式而不是位表示形式的原因有哪些?在某些情况下,首选使用二进制形式吗?
最佳答案
首先,float
在您可能会遇到的任何体系结构上均为4个字节,因此,当您将4个字节的内存从文件写入文件时,不会被“截断”。
关于您的主要问题,许多常规文件格式都是为“互操作性”和易于读取/写入而设计的。这就是为什么文本(几乎是通用的可移植表示形式(尽管存在字符编码问题))被最常使用的原因。
例如,程序很容易从文本文件中读取字符串“123
”,并知道它代表数字123。
(但请注意,文本本身不是一种格式。您可以选择将所有数据元素表示为ASCII / Unicode /任何字符串,并将所有这些字符串相互组合以形成文本文件,但仍然需要确切指定每个元素的含义以及可以在何处找到哪些数据,例如,一种非常简单的基于文本的3D三角形网格文件格式可能在文件的第一行中具有网格中的三角形数量,然后是三个三元组接下来的N行上的实数,每行指定一个三角形的三个顶点的X,Y,Z坐标所需的9个数字。)
另一方面是二进制格式。它们中通常包含与计算机内存中相同格式的数据元素。这意味着整数用固定数量的字节表示(1、2、4或8,通常采用“二进制补码”格式),或者实数由IEEE 754格式的4或8个字节表示。 (请注意,为了保持重点,我省略了很多细节。)
二进制格式的主要优点是:
但是,第三项优势要求您将磁盘上数据的布局(逐位)与内存中数据结构的布局完全匹配。这意味着,几乎总是,该文件格式仅适用于您的代码和仅适用于您的代码,即使您在自己的代码中进行了一些更改,也无法使用。这意味着它根本不是便携式的或不能互操作的。但是,该死的工作起来真是太快了!
二进制格式也有缺点:
既然您提到了3D模型数据,那么让我给您提供一个示例,说明典型游戏引擎中使用的格式。游戏引擎运行时很可能需要读取模型时所能拥有的最快速度,并且3D模型很大,因此通常其模型文件具有非常特定且并非一成不变的格式。但是这种格式很可能不受任何建模软件的支持。因此,您需要编写一个转换器(也称为导出器或导入器),该转换器将采用通用的通用格式(例如OBJ,DAE等)并将其转换为引擎特定的专有格式。但是正如我提到的那样,使用基于文本的格式进行读取/传输/处理比使用二进制格式更容易,因此您通常会选择基于文本的通用格式来将模型导出到其中,然后在它们上运行转换器以进行优化,二进制,特定于引擎的运行时格式。
关于c++ - 将数字数据写成二进制还是写成二进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31362637/