Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二进制文件在C+中的可移植性+;?_C++_File - Fatal编程技术网

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

C++ 二进制文件在C+中的可移植性+;?,c++,file,C++,File,对于二进制文件的可移植性,我对二进制I/O有疑问。 假设运行我的软件的PC使用8个字节来存储双变量。 生成的二进制文件将有8个字节用于双变量。 现在假设该文件是在一台PC中打开的,该PC使用6个字节作为双变量(仅假设)。 然后应用程序将只从文件中读取6个字节,并将其存储在内存中的双变量中。 这不仅会导致数据下溢/溢出,而且双精度后读取的数据肯定会不正确,因为读取不足会产生2字节的偏移量。 我希望我的应用程序不仅支持32/64位,还支持Windows和Ubuntu PC。 那么,如何确保在任何PC

对于二进制文件的可移植性,我对二进制I/O有疑问。 假设运行我的软件的PC使用8个字节来存储双变量。 生成的二进制文件将有8个字节用于双变量。 现在假设该文件是在一台PC中打开的,该PC使用6个字节作为双变量(仅假设)。 然后应用程序将只从文件中读取6个字节,并将其存储在内存中的双变量中。 这不仅会导致数据下溢/溢出,而且双精度后读取的数据肯定会不正确,因为读取不足会产生2字节的偏移量。 我希望我的应用程序不仅支持32/64位,还支持Windows和Ubuntu 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