C++ 跨编译器读取和写入原始对象到磁盘(istream)
我一直在移植一些旧的遗留代码。它已经有15年的历史了,用于使用一些旧的Borland编译器进行编译。由于缺少依赖项/编译器,我们无法编译旧代码 我们有这样的东西:C++ 跨编译器读取和写入原始对象到磁盘(istream),c++,C++,我一直在移植一些旧的遗留代码。它已经有15年的历史了,用于使用一些旧的Borland编译器进行编译。由于缺少依赖项/编译器,我们无法编译旧代码 我们有这样的东西: class SegmentParameterDataRecord { private: int32_t parameterId; double value; public: SegmentParameterDataRecord() : parameterId(0), value(0.0) {} int32_t &am
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++占用了更多的对象空间。这是一个基于二进制分析的预感。你有需要读回系统的旧数据吗?如果没有,你能用文本格式而不是二进制格式重写函数吗?是的,我必须能够打开这些旧文件。