-3

クラスのポインタをファイルに書き込んで読み込もうとしています。書き込みは問題ありませんが、読み取りで型変換のエラーが表示されます。助けてください。this(integer). の例を見てみましょう。int* の代わりに int を使用すると、コードは実行されますがうまくいきません。

#include<iostream>    
#include<windows.h>
#include<fstream>
using namespace std;   
void save(int *ptr)
{
    ofstream data;
    data.open("info.txt",ios::app);
    if (data.is_open())
    {
        data<<ptr;
        data.close();
    }
    else 
    {
        cout << "Unable to open file";
    }

}

int* loaddata()
{
    ifstream data;
    int ptr;


    data.open("info.txt");
    if (data.is_open())
    {
        while (!data.eof() )
        {
            data>>ptr;
        }

        data.close();
    }
    else 
    {
        cout << "Unable to open file";
    }

    return ptr;


}

void main()
{
    int a=0;

    save(&a);

    int *ptr=loaddata();
}
4

2 に答える 2

2

ポインタは単なるメモリアドレスです。あなたが言ったように、あなたはそれをうまく書くことができますが、あなたがそれを読むとき、それはまだ単なるメモリアドレスです. それが指していたオブジェクトが、読み取り時にまったく同じメモリ位置にない限り、ランダム データへのポインターを「読み取る」ことになり、それを以前に指していたオブジェクトのクラスに変換することはできません。

これは、蝶の位置 (緯度/経度) を保存し、その位置からその蝶を見つけようとするようなものです。蝶は今、まったく別の場所にいる可能性が最も高い.

于 2013-07-27T21:53:57.837 に答える
0

あなたがしようとしているのは、通常シリアライゼーションと呼ばれていたものです。

アイデアは、クラス インスタンス (含まれるすべてのデータ) とインスタンスのアドレスになる ID を書き込むことです。これは非常に一意の ID であるためです。シリアライゼーション ライブラリは、インスタンスが 1 つだけ書き込まれるようにし (必要なデータ セットは 1 つだけであるため)、このインスタンスの以降の書き込みはすべて、ポインターを書き込むことによってのみ行われます。

読み返しも非常に簡単です。シリアライゼーション ライブラリは、クラスのインスタンスが必要であることを認識しており、一意の ID (前述のポインター/アドレス) をまだ使用していない場合は、以前に記述された内容で新しいインスタンスを生成します。その後、「読み取りポインター」を取得しようとするたびに、新しく生成されたインスタンスの実際の値がポインターに設定されます。

シリアライザーのパターンまたはboost::serialize http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/index.htmlのような具体的な実装を探してください

于 2015-06-08T13:08:18.410 に答える