0

バイナリファイルからSRDオブジェクトの配列を読み取っていますが、これが初めてだったので、何が起こるかわからなかったため、ヘッダーを変更してすべてのメンバーを公開しました。割り当てを完了しました。残っているのは、これらのメンバーをプライベートにし、それらを変更するメソッドを作成することだけです。ただし、問題があります。デバッグの目的で、メンバーを1つだけプライベートにし、そのためのすべてのメソッドを作成するまで、そのように保持します。このメンバーは単にunsignedintCです。それを返すメソッドを作成すると(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 ...にアクセスできます。つまり、Cにアクセスすることは問題ではありませんが、前のforループのfreadには設定されていません。これらの値を設定するある種の代入演算子が必要だと思いますが、手がかりがありません...

4

2 に答える 2

1

変数をプライベートにすると、SRDクラスはプレーンオールドデータ(POD)ではなくなります。したがって、メモリ内の表現に関する保証はありません。したがって、f.readこのように動作することを信頼することはできません。

クラス内およびそのメソッド内でread、unsignedintメンバー変数に直接read-from-streamメソッドを追加することをお勧めします。次に、ループで、そのメソッドを呼び出すだけです(ストリームを参照またはポインターとして渡します)。

編集、要求に応じた例:

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は2番目で、デバッグ中は最初にCから開始し、2番目の位置から上記に移動しました。パブリックのもの、クラスの構造を変更しました。

それで、

Class P
{
int i;
char c;
}

とは異なり

Class P
{
char c;
int i;
}

バイナリファイルのデータには特定の順序があり、クラス定義の順序を並べ替えると、メンバー(c)は別のメンバー(i)向けのデータにアクセスしようとします。

于 2012-08-12T04:01:47.833 に答える