我有一個類包含許多不同的變量,例如有幾個多維向量在那裏。保存和加載數據到一個文件c + +(初學者)
我聽說你可以直接存儲和加載數據到一個文件,但在多大程度上?
例如,如果我創建這個類的一個實例,填充它,然後將其保存到一個文件,我可以加載它的方式相同嗎?像這樣工作嗎?我是否一次性保存所有數據,還是必須以某種方式分解數據?
我有一個類包含許多不同的變量,例如有幾個多維向量在那裏。保存和加載數據到一個文件c + +(初學者)
我聽說你可以直接存儲和加載數據到一個文件,但在多大程度上?
例如,如果我創建這個類的一個實例,填充它,然後將其保存到一個文件,我可以加載它的方式相同嗎?像這樣工作嗎?我是否一次性保存所有數據,還是必須以某種方式分解數據?
這是不完全的初學者使用C++主題
C++有沒有自動的方式來存儲/從文件加載你的對象/。無論您選擇哪種方式,您都必須自己實施。
你可以選擇重載<<
的>>
運營商提供流使用,或者你可能想要去用自己的Load
和Store
方法(或任何名字您選擇合適的一樣,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::binary
和ifstream:binary
標誌,並且不需要額外的分隔符,例如' '
和endl
序列化流)。
通常,當您想到序列化時,您還想考慮流的版本控制 - 這是另一個單獨的主題。
你可以考慮實現流操作符。
有了這些,你可以簡單地使用下面的讀寫:
fileStream >> yourObject
fileStream << yourObject
基本上在>>操作符,你會讀到流,並與實測數據構建的對象。 在<運算符中,將對象寫入流中的格式與您希望讀取的格式相同。
使用這種工作方式,您可以序列化您擁有的任何對象。
Google針對「過載流操作符」知道如何實現這些操作符。
這就是我所做的..我有一個序列化框架,重載相同的運營商。我相信有人會說 - 不要重新發明輪子,只是使用提升或其他。我喜歡控制代碼的功能,以實現如此重要的功能。 – 2012-07-06 16:51:29
你可以提供一個代碼遍歷一個類的所有成員(可以跳過非重要的代碼並轉換其他代碼)並準備連續的數據流。這是更狹義的序列化。 Ofc同樣的事情需要在閱讀時做相反的事情。
在C++中,您還可以執行二進制轉儲,如CopyMemory(ptr, sizeof(*ptr)
。它只能在你的數據不包含指針的情況下工作(特別是包含帶虛擬方法的類的隱藏指針)。它唯一的優點是簡單和巨大的速度。這種方法要求你的數據在內存中是連續的,有時對自己有利。
您需要將數據轉換爲字節序列以及從字節序列轉換數據。閱讀「序列化」。 – aschepler 2012-07-06 15:46:26
您正在尋找「序列化」和「反序列化」。你使用的是什麼框架,還是這個純粹的STL? – 0xC0000022L 2012-07-06 15:47:50
STL,我也使用VS2010 – 2012-07-06 15:49:36