1
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;


class PERSON{
    string name, surname;

public:

    void set_name(string aname, string asurname){
        name = aname;
        surname = asurname;
    };

    void read(){

    }

    void output(){
     cout << name << " " << surname << "\n";
    }

    void save(PERSON *x){
        ofstream file("test.bin", ios::out | ios::app | ios::binary);


        if(!file.is_open()){
                cout << "ERROR\n";
        }else{
                file.write((char*)x, sizeof(*x));
                file.close();
        }

    }
};




/*
 * 
 * 
 * 
 */
int main(int argc, char** argv) {




    PERSON * person1 = new PERSON;
    PERSON * person2 = new PERSON;

    person1->set_name("Amon", "Raa");
    person1->save(oseba1);








    ifstream file2("test.bin", ios::in | ios::binary);

    if(!file2.is_open()){
        cout << "Error\n";
        return 0;
    }


    while(!file2.eof()){
        file2.read((char *)person2, sizeof(*person2));
        person2->output();
    }

    file2.close(); 


    return 0;


}

これは私のコードです...何が間違っていますか? 私がやろうとしているのは、毎回クラスをバイナリファイルの最後に保存してから、すべてのエントリを読み取ることです...

しかし、プログラムを実行するたびに、最後に入力した名前のみが出力されます

ファイルが正しく書き込まれ、出力に問題がないときに最初に実行してから、名前を別の名前に変更します。John Doeとしましょう。2回のJohn Doeの出力が得られます

助けてください...私は完全な初心者です;(

4

3 に答える 3

1

クラスのシリアル化は、たとえば、boost パッケージに含まれています。

http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html

この種の機能を実際に自分で実装したいとは思いません。

于 2013-03-02T16:56:10.357 に答える
1

C++ でクラスのバイナリ イメージを単純に書き出すことはできません。特に、ポインターと非 POD メンバーを含むクラスはそうです。データに間接性があると、単にメモリ イメージを書き出すだけでは機能しません。これは、クラスのメモリ イメージを書き出すだけではポイント先のデータが含まれないためであり、これを機能させるためには、ポイント先のデータを含むすべてのデータを、保存したときとまったく同じメモリ位置にロードする必要があります。それは簡単にはできません (控えめに言っても)。

2 つのオプションがあります。1 つはマニュアル、もう 1 つはサード パーティのライブラリを使用します。

1) 簿記の情報をまとめて、各メンバーを個別に読み書きします。実際にロードして保存する必要があるのは、2つの文字列の内容とそれぞれの長さだけであるため、それはあなたの場合にうまくいくはずです

2) 他のオプション - 特にデータ構造が使用している構造よりも複雑な場合 - boost::serializationのようなものを使用して、単調な作業を行うことです。

于 2013-03-02T16:56:37.063 に答える