C++ 二进制文件在C+中的可移植性+;?
对于二进制文件的可移植性,我对二进制I/O有疑问。 假设运行我的软件的PC使用8个字节来存储双变量。 生成的二进制文件将有8个字节用于双变量。 现在假设该文件是在一台PC中打开的,该PC使用6个字节作为双变量(仅假设)。 然后应用程序将只从文件中读取6个字节,并将其存储在内存中的双变量中。 这不仅会导致数据下溢/溢出,而且双精度后读取的数据肯定会不正确,因为读取不足会产生2字节的偏移量。 我希望我的应用程序不仅支持32/64位,还支持Windows和Ubuntu PC。C++ 二进制文件在C+中的可移植性+;?,c++,file,C++,File,对于二进制文件的可移植性,我对二进制I/O有疑问。 假设运行我的软件的PC使用8个字节来存储双变量。 生成的二进制文件将有8个字节用于双变量。 现在假设该文件是在一台PC中打开的,该PC使用6个字节作为双变量(仅假设)。 然后应用程序将只从文件中读取6个字节,并将其存储在内存中的双变量中。 这不仅会导致数据下溢/溢出,而且双精度后读取的数据肯定会不正确,因为读取不足会产生2字节的偏移量。 我希望我的应用程序不仅支持32/64位,还支持Windows和Ubuntu PC。 那么,如何确保在任何PC
那么,如何确保在任何PC机上从同一文件读取的数据都是相同的呢?一般来说,您应该将数据包装成二进制文件存储在自己的数据结构中,并对这些数据结构执行与平台无关的读/写操作-基本上,对于所有平台,写入磁盘的二进制数据结构的大小应相同(所有受支持平台上基本数据的最大可能大小) 在较小数据量的平台上写入数据时,应使用额外的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;
class-CustomDouble
{
公众:
双val;
静态常量int磁盘大小;
void toFile(流和文件的std::of)
{
int字节(0);
write(reinterpret_cast(&val),sizeof(val));
BytesWrited+=sizeof(val);
而(bytesWrite一般来说,您应该将要存储在二进制文件中的数据包装到您自己的数据结构中,并对这些数据结构执行与平台无关的读/写操作-基本上,写入磁盘的二进制数据结构的大小对于所有平台都应该相同(在所有支持的平台上,基本数据的最大可能大小)
在较小数据量的平台上写入数据时,应使用额外的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;
class-CustomDouble
{
公众:
双val;
静态常量int磁盘大小;
void toFile(流和文件的std::of)
{
int字节(0);
write(reinterpret_cast(&val),sizeof(val));
BytesWrited+=sizeof(val);
虽然(BytesWrited包括固定大小的类型定义,因此int32_t
的长度始终为4字节。当类型的大小对您很重要时,您可以使用它们代替常规类型。包括固定大小的类型定义,因此int32_t
的长度始终为4字节。您可以使用它们代替常规类型。)当类型的大小对您很重要时,使用常规类型。使用或任何其他跨平台序列化库。您也可以推出自己的解决方案,因为char
保证为1字节(即将任何内容序列化为char
数组).使用或任何其他跨平台序列化库。您也可以推出自己的解决方案,因为char
保证为1字节(即将任何内容序列化为char
数组).还有更多的不兼容,例如endianess!最好使用文本或其他标准格式。看看序列化/反序列化。数据太大,无法使用文本文件,通常以GB为单位。在文本中读取和写入这些双变量需要大量时间。因此,请转到二进制文件。双变量是,所以它们保证总是64位。这里的大小不是问题,只是长度(一个不太可能遇到的问题)@Cool_Coder只有少数类型具有固定的大小,可能是因为它们不是源于C。正如您所看到的,整数类型和大多数基本类型具有指定的范围。然而,浮点和双精度是IEEE标准,具有非常具体的布局和大小,永远不会改变(特别是因为处理器现在通常有寄存器,这符合标准)。它们是一个例外,但在这种情况下可能对您很有用。存在更多不兼容,例如endianess!最好使用文本或其他标准格式。查看序列化/反序列化。数据太大,无法使用文本文件,通常以GB为单位。在文本需要花费大量的时间。因此转到二进制文件。双精度是一个非常复杂的问题,因此它们保证始终为64位。这里的大小不是问题,只是长度(不太可能遇到这个问题)@Cool_Coder只有少数类型具有固定的大小,可能是因为它们不是源于C。正如您所看到的,整数类型和大多数基本类型具有指定的范围。然而,浮点和双精度是IEEE标准,具有非常具体的布局和大小,永远不会改变(特别是因为处理器现在通常有寄存器,这符合标准)。它们是一个例外,但在这种情况下可能对您有用。1 b不能保证char