0

我一直在从二进制文件中读取一组 SRD 对象 - 但由于这是我第一次这样做,我修改了一个标头,使其所有成员都公开,因为我不确定会发生什么。我已经完成了我的任务,剩下的就是将这些成员设为私有并编写修改它们的方法。但是,有一个问题。出于调试目的,我只将 1 个成员设为私有,在我为它编写所有方法之前,我将保持这种状态。这个成员只是一个无符号的int C。当写一个返回它的方法时(getC()返回C),它返回的值是0000...3435973836,意思是它没有设置?因此,我根据二进制文件中的对象数量创建了一个指向 SRD 的指针数组。

SRD *a;
...
a = new SRD[numOfRecords];

并且数组是从文件中填充的......

for (i=0; i<numOfRecords; i++)
    {
        f.seekg(i * sizeof s);  
        f.read((char *)&a[i], sizeof s);
        cout << a[i].getCC();
    }

现在,a[i].getCC()当 C 公开时可以工作,但将其设为私有会使 000..3435... 意味着访问它不是问题,但它没有在前一个 for 循环的 fread 中设置。我想我需要某种类型的赋值运算符来设置这些值,但我不知道......

4

2 回答 2

1

当您将变量设为私有时,SRD 类不再是普通旧数据 (POD)。因此,您无法保证它在内存中的表示,因此您不能再依赖f.read这样的工作。

我建议您在您的类中和该方法内添加一个 read-from-stream 方法,read直接添加到 unsigned int 成员变量中。然后,在循环中,您只需调用该方法(将流作为引用或指针传递)。

编辑,按要求举例:

class SRD {
  ...
  public:
    void readFromStream(istream& f) {
      f.read(&CC, sizeof CC);
    }
  private:
    unsigned int CC;
};

环形:

for (i=0; i<numOfRecords; i++)
{
    a[i].readFromStream(f);
    cout << a[i].getCC();
}
于 2012-08-11T19:02:18.423 回答
0

实际上,问题出在其他问题上:标头是按特定顺序定义的,第一个成员是一个数组,而 C 是第二个,在调试时我首先从 C 开始 - 并将其从第二个位置移动到上面public 一,改变了类的结构。

所以,

Class P
{
int i;
char c;
}

不同于

Class P
{
char c;
int i;
}

因为二进制文件中的数据具有特定的顺序,并且在重新排列类定义的顺序时,成员 (c) 会尝试访问打算用于另一个成员 (i) 的数据

于 2012-08-12T04:01:47.833 回答