7

私は多くの異なる変数を含むクラスを持っています。たとえば、そこにはいくつかの多次元ベクトルがあります。

データを直接ファイルに保存してロードできると聞きましたが、どの程度ですか?

たとえば、このクラスのインスタンスを作成し、それを埋めてからファイルに保存した場合、同じ方法でロードできますか?それはどのように機能しますか?すべてを一度に保存するだけですか、それともデータを何らかの方法で分割する必要がありますか?

4

3 に答える 3

7

これは、C++の初心者向けのトピックではありません。

C ++には、ファイルへのオブジェクトの保存/ファイルからのオブジェクトのロードを自動化する方法がありません。どちらの方法を選択した場合でも、自分で実装する必要があります。

<<ストリームで使用する>>演算子をオーバーロードすることを選択したり、独自Loadのメソッド(または、 /Storeなどの適切な名前を選択したもの)を使用したりすることができます。個人的には、演算子を使わずに独自の関数を作成することを好みますが、それは私だけです。SerializeDeserialize

簡単な例を次に示します(オーバーロードされた演算子<<>>演算子を使用)。

#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

通常、シリアル化について考えるときは、ストリームのバージョン管理についても考える必要があります。これは別のトピックです。

于 2012-07-06T16:12:49.377 に答える
1

ストリーム演算子の実装を検討できます。

これらを使用すると、以下を使用して読み取りと書き込みを行うことができます。

fileStream >> yourObject
fileStream << yourObject 

基本的に>>演算子では、ストリームを読み取り、見つかったデータを使用してオブジェクトを作成します。<<演算子では、オブジェクトを読み取るのと同じ形式でストリームに書き込みます。

この作業方法を使用して、所有している任意のオブジェクトをシリアル化できます。

これらの演算子を実装する方法を知るための「オーバーロードストリーム演算子」のGoogle。

于 2012-07-06T15:48:33.637 に答える
1

クラスのすべてのメンバーを反復処理するコードを提供し(オプションで重要でないメンバーをスキップして他のメンバーを変換する)、データの連続ストリームを準備することができます。それは狭義のシリアル化です。多くの場合、読むときに同じことを逆に行う必要があります。

C ++では、のようなバイナリダンプを実行することもできますCopyMemory(ptr, sizeof(*ptr)。データにポインターが含まれていない場合にのみ機能します(特に、仮想メソッドを持つクラスの非表示ポインターが含まれます)。その唯一の利点は、シンプルさと驚異的なスピードです。このアプローチでは、データがメモリ内で連続している必要がありますが、それ自体が有益な場合もあります。

于 2012-07-06T16:02:25.713 に答える