2012-07-06 55 views
4

我有一個類包含許多不同的變量,例如有幾個多維向量在那裏。保存和加載數據到一個文件c + +(初學者)

我聽說你可以直接存儲和加載數據到一個文件,但在多大程度上?

例如,如果我創建這個類的一個實例,填充它,然後將其保存到一個文件,我可以加載它的方式相同嗎?像這樣工作嗎?我是否一次性保存所有數據,還是必須以某種方式分解數據?

+1

您需要將數據轉換爲字節序列以及從字節序列轉換數據。閱讀「序列化」。 – aschepler 2012-07-06 15:46:26

+2

您正在尋找「序列化」和「反序列化」。你使用的是什麼框架,還是這個純粹的STL? – 0xC0000022L 2012-07-06 15:47:50

+0

STL,我也使用VS2010 – 2012-07-06 15:49:36

回答

4

這是不完全的初學者使用C++主題

C++有沒有自動的方式來存儲/從文件加載你的對象/。無論您選擇哪種方式,您都必須自己實施。

你可以選擇重載<<>>運營商提供流使用,或者你可能想要去用自己的LoadStore方法(或任何名字您選擇合適的一樣,Serialize/Deserialize)。我個人更喜歡創建自己的功能,而不是使用操作員,但它只是我。

下面是一個簡單的例子(與超載<<>>運營商):

#include <fstream> 
#include <iostream> 

using namespace std; 

class MyClass 
{ 
public: 
    MyClass (int x) : m_x(x), m_y(x+1) {} 

    friend istream& operator >> (istream& in, MyClass& obj); 
    friend ostream& operator << (ostream& out, const MyClass& obj); 

private: 
    int m_x; 
    int m_y; 
}; 

istream& operator >> (istream& in, MyClass& obj) 
{ 
    in >> obj.m_x; 
    in >> obj.m_y; 
    return in; 
} 

ostream& operator << (ostream& out, const MyClass& obj) 
{ 
    out << obj.m_x << ' '; 
    out << obj.m_y << endl; 
    return out; 
} 

int main(int argc, char* argv[]) 
{ 
    MyClass myObj(10); 
    MyClass other(1); 
    cout << myObj; 
    ofstream outFile ("serialized.txt"); 
    outFile << myObj; 
    outFile.close(); 
    ifstream inFile ("serialized.txt"); 
    inFile >> other; 
    inFile.close(); 
    cout << other; 
    return 0; 
} 

值得一提的是,你應該照顧有關序列化格式。在上面的例子中,它只是文本;但如果要存儲大量這些對象,則可能會開始考慮序列化二進制數據(在打開文件時,您需要使用ofstream::binaryifstream:binary標誌,並且不需要額外的分隔符,例如' 'endl序列化流)。

通常,當您想到序列化時,您還想考慮流的版本控制 - 這是另一個單獨的主題。

0

你可以考慮實現流操作符。

有了這些,你可以簡單地使用下面的讀寫:

fileStream >> yourObject 
fileStream << yourObject 

基本上在>>操作符,你會讀到流,並與實測數據構建的對象。 在<運算符中,將對象寫入流中的格式與您希望讀取的格式相同。

使用這種工作方式,您可以序列化您擁有的任何對象。

Google針對「過載流操作符」知道如何實現這些操作符。

+0

這就是我所做的..我有一個序列化框架,重載相同的運營商。我相信有人會說 - 不要重新發明輪子,只是使用提升或其他。我喜歡控制代碼的功能,以實現如此重要的功能。 – 2012-07-06 16:51:29

0

你可以提供一個代碼遍歷一個類的所有成員(可以跳過非重要的代碼並轉換其他代碼)並準備連續的數據流。這是更狹義的序列化。 Ofc同樣的事情需要在閱讀時做相反的事情。

在C++中,您還可以執行二進制轉儲,如CopyMemory(ptr, sizeof(*ptr)。它只能在你的數據不包含指針的情況下工作(特別是包含帶虛擬方法的類的隱藏指針)。它唯一的優點是簡單和巨大的速度。這種方法要求你的數據在內存中是連續的,有時對自己有利。