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,我得到 2times 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 成员的类。一旦你的数据有间接性,简单地写出内存映像就行不通了,既因为只写出类的内存映像不包括指向的数据,又因为为了让它工作你会必须将所有数据(包括指向的数据)加载到与保存它们时完全相同的内存位置。这不容易(委婉地说)。

您有两种选择,一种是手册,一种是使用第三方库:

1)你用一堆记账信息分别写和读每个成员。这应该适用于您的情况,因为您真正需要加载和保存的是两个字符串的内容及其各自的长度

2)另一种选择 - 特别是当数据结构比您使用的更复杂时 - 是使用类似boost::serialization的东西来为您完成繁重的工作。

于 2013-03-02T16:56:37.063 回答
0

您必须使用 PERSON 类的指针数组。然后从二进制文件中读取并填充人员数组。

ifstream input("PERSON.std",ios::binary);
    input.seekg(0, ios::end);
    int count = input.tellg() / sizeof(PERSON);
    PERSON *persons = new PERSON[count];
    input.seekg(0, ios::beg);
    input.read((char*) persons, sizeof(PERSON)*count);
    cout << count << endl;

    for (int j = 0; j < count; j++)
    {
        cout << count << endl;
        cout <<persons[j].output() << "\n";
    }
    cout << '\n';
    input.close();
于 2015-03-31T17:09:31.480 回答