2015-05-08 56 views
1

我在寫C++和從二進制文件讀取時遇到了很多困難。 我學到了很多棧的問題,但我從來沒有得到它的工作和我猜測,問題在於在閱讀過程中,在二進制文件中讀取字符串C++

下面是讀取和保存方法:

void date::save(ofstream& fo){ 
    fo.write((char *) &jour, sizeof(int)); 
    fo.write((char *)&moi, sizeof(int)); 
    fo.write((char *)&annee, sizeof(int)); 

    size_t len = heure.size(); 
    fo.write((char *)&len,sizeof(size_t)); 
    fo.write(heure.c_str(), heure.size()); 
} 

void date::load(ifstream& fi){ 
    fi.read((char *)&jour, sizeof(int)); 
    fi.read((char *)&moi, sizeof(int)); 
    fi.read((char *)&annee, sizeof(int)); 

    size_t len; 
    fi.read((char *)&len, sizeof(size_t)); 
    char* temp = new char[len+1]; 
    fi.read(temp, len); 
    temp[len] = '\0'; 
    heure = temp; 
    delete [] temp; 
} 

在additon:是否可以使用ofstream.write()函數直接保存具有動態屬性的類?

非常感謝。

+0

你好!在將來的帖子中,請在你的問題標籤中加入你正在使用哪種語言(在本例中爲C++),以便接收最大量的視圖和可能的答案。 –

+0

問題到底是什麼?我看不出這個代碼有什麼問題。 –

回答

0

的閱讀和寫作似乎分配

heure = temp; 

時,有一個問題是關於一見鍾情的,正確的。 你分配len + 1個字節的內存。溫度指向該內存的開始。你的任務(heure = temp)之後的 heure也指向同樣的內存。然後你調用delete,並從這一點開始,任何其他操作都可以將任何數據寫入該內存(稱爲「wild pointer」)。

你必須使用

strcpy(heure, temp); 

到每個字節從臨時複製到由厄爾分配的內存。確保heure已經分配了足夠的空間來適應temp的所有字節。

+0

我不認爲這是它。 'heure'的定義沒有顯示,但它看起來像一個'std :: string',所以這個任務應該複製一份。 –

+0

woops,你是對的。 – h3n