C ++中二进制文件的可移植性?

Cool_Coder

对于二进制文件的可移植性,我对二进制I / O表示怀疑。可以说运行我的软件的PC使用8个字节来存储double变量。生成的二进制文件将有8个字节用于double变量。现在说文件正在PC中打开,该PC使用6个字节的双变量(假设)。然后,应用程序将从文件中仅读取6个字节,并将其存储在内存中的double变量中。这不仅会导致数据下溢/溢出,而且由于在读取过程中会产生2字节的偏移量,因此在double之后读取的数据肯定是不正确的。我不仅要为32/64位支持我的应用程序,而且还希望为Windows,Ubuntu PC的应用程序提供支持。那么,如何确保从任何PC的同一文件读取的数据是相同的呢?

伊利亚·科别列夫斯基(Ilya Kobelevskiy)

通常,您应该将数据包装在自己的数据结构中的二进制文件中,并对这些数据结构实现平台无关的读/写操作-基本上,写入磁盘的二进制数据结构的大小对于所有平台都应该相同(最大可能大小)所有支持的平台上的基本数据)。

在具有较小数据大小的平台上写入数据时,应使用额外的0字节填充数据,以确保记录的数据大小保持不变。

读取时,可以在已知大小的固定数据块中读取整个数据,并且应根据写入/正在读取的平台执行转换。这也应注意字节序。您可能需要包含一些标头,以指示数据大小,以便在读取文件时区分在不同平台上记录的文件。

这将为二进制文件提供真正独立于平台的序列化。

双打的例子

class CustomDouble
{
public:
double val;
static const int DISK_SIZE;

void toFile(std::ofstream &file)
{
   int bytesWritten(0);
   file.write(reinterpret_cast<const char*>(&val),sizeof(val));
   bytesWritten+=sizeof(val);
   while(bytesWritten<CustomDouble::DISK_SIZE)
   { 
      char byte(0);
      file.write(&byte,sizeof(byte));
      bytesWritten+=sizeof(byte);
   }

}
};
const int CustomDouble::DISK_SIZE = 8;

这样可确保您始终在平台上写入有关double大小的8个字节。读取文件时,您始终始终以二进制形式读取这8个字节,并在必要时根据写入/读取的平台进行转换(您可能会在文件中添加一些小标头,以标识所记录的平台在)

尽管自定义转换确实增加了一些开销,但与将值存储为文本的开销相比要少得多,通常,您将仅对不兼容的平台执行转换,而对于相同的平台则没有开销。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章