2012-08-11 52 views
0

我一直在從二進制文件中讀取SRD對象的數組 - 但由於這是我第一次這樣做,我修改了一個頭部,使其所有成員都公開,因爲我不確定會發生什麼正在繼續。我完成了我的任務,剩下的就是讓這些成員保持私密,並編寫修改它們的方法。但是,有一個問題。 爲了調試的目的,我只把一個成員私人,直到我爲它寫所有的方法,我會保持這種方式。這個成員只是一個無符號整數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中設置的。我想我需要一些類型的賦值運算符,即設置這些值,但我不知道...

回答

0

其實問題是別的東西:頭是按照一定的順序定義,第一部件是一個數組,而C是第二個,並且在調試時我首先使用C開始 - 並將它從第二個位置移動到上面的公共位置,改變了這個類的結構。

所以,

Class P 
{ 
int i; 
char c; 
} 

不同於

Class P 
{ 
char c; 
int i; 
} 

因爲在二進制文件中的數據具有特定的順序,並重新排列所述類defenition的順序時,一個構件(c)嘗試以訪問另一個成員的數據(i)

1

當您將變量設置爲private時,SRD類不再是plain old data (POD)。因此,您對內存中的表示沒有任何保證,因此您不能再依賴f.read這樣工作。

我建議你在你的類中添加一個從數據流中讀取的方法,並在該方法中直接將read添加到unsigned int成員變量中。然後,在循環中,您只需調用該方法(將流作爲引用或指針傳遞)。作爲請求

EDIT,例如:

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(); 
} 
+0

你能寫一個簡單的例子,簡單說一個1成員類如何做到這一點? – 2012-08-11 19:17:20

+0

添加示例,希望它有幫助。 – Reunanen 2012-08-11 20:27:04

+0

實際上,問題是另外一件事:標題是按特定順序定義的,第一個成員是一個數組,而C是第二個成員,而在調試時,我首先用C開始 - 並將它從第二個位置移動到第二個位置以上的公衆,改變了班級的結構。 so, P類 { int i; char c; } 從 P類 { 炭Ç不同; int i; } 由於二進制文件中的數據具有特定順序,並且在重新排列類defenition的順序時,成員(c)嘗試訪問用於另一個成員(i)的數據, – 2012-08-12 01:53:26