C++ 跨编译器读取和写入原始对象到磁盘(istream)

C++ 跨编译器读取和写入原始对象到磁盘(istream),c++,C++,我一直在移植一些旧的遗留代码。它已经有15年的历史了,用于使用一些旧的Borland编译器进行编译。由于缺少依赖项/编译器,我们无法编译旧代码 我们有这样的东西: class SegmentParameterDataRecord { private: int32_t parameterId; double value; public: SegmentParameterDataRecord() : parameterId(0), value(0.0) {} int32_t &am

我一直在移植一些旧的遗留代码。它已经有15年的历史了,用于使用一些旧的Borland编译器进行编译。由于缺少依赖项/编译器,我们无法编译旧代码

我们有这样的东西:

class SegmentParameterDataRecord
{
private:
  int32_t parameterId;
  double value;

public:
  SegmentParameterDataRecord() : parameterId(0), value(0.0) {}
  int32_t & getParameterId() { return parameterId; }
  double & getValue() { return value; }

  void read(std::istream & in);
  void write(std::ostream & out);
};
注意
read
write
方法。这是:

void SegmentParameterDataRecord::read(std::istream & in)
{
  in.read((char *) this, sizeof(*this));
}

void SegmentParameterDataRecord::write(std::ostream & out)
{
  out.write((char *) this, sizeof(*this));
}
这引起了我的一些担忧。请注意,旧代码强制转换为
char*
,并将数据作为内存的原始字节进行处理。我相信,当我将此代码移植到最新的MinGW时,我遇到了问题

1)
SegmentParameterDataRecord
的内存表示形式是否可能在不同的编译器中有所不同,因此在一个编译器(15岁的Borland)上写入
SegmentParameterDataRecord
,然后在另一个编译器(最近的MinGW)上读取
会有问题

2) 是否可能
sizeof(SegmentParameterDataRecord)
与15年前的Borland编译器和今天的MinGW不同

3) 这种可能性有多大

sizeof(SegmentParameterDataRecord)是否可能不同于15年前的Borland编译器和今天的MinGW


这是绝对可能的。事实上,
sizeof(int)
在不同的编译器和机器上可能会有所不同。例如,在32位机器上,
sizeof(int)
通常为4字节,但在64位机器上,
sizeof(int)< />代码可以是8字节。< /P>我们通过替换<代码> int 和长< /C> >,用<代码> INT32×T 和未签名INT/C++ >和<代码>未签名长< /COD> > <代码> UINT32×T<<代码>。因此,从这个角度来看,新代码现在应该具有与原始实现相同的原语大小。在Windows 64位上,
sizeof(int)
仍然是4。@RemyLebeau,这就是我使用“可以”的原因。@MiyazawaKenji如何定义
int32_t
,等等?这些是定制的typedef吗?如果是这样的话,那么你肯定可以用typedef替换它们,以保留代码其余部分所期望的大小。这些在cstdint中定义为保证32位。鉴于结构中有大量未使用的空间,我推测这是一个16位编译器。如果准确,您应该能够使用uuu属性uuu((打包))拯救它。通过比较新旧编译器上的sizeof(SegmentParameterDataRecord)进行双重检查。您需要相同的值才能尝试拯救数据。@HansPassant您所说的未使用空间是什么意思?还想知道Hans所说的未使用空间是什么意思。不过,我可以确认,二进制文件似乎(不确定)比G++占用了更多的对象空间。这是一个基于二进制分析的预感。你有需要读回系统的旧数据吗?如果没有,你能用文本格式而不是二进制格式重写函数吗?是的,我必须能够打开这些旧文件。