【问题标题】:C++: Read and write classesC++:读写类
【发布时间】:2013-03-02 16:50:13
【问题描述】:
#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 的输出

请帮助...我是一个完整的初学者;(

【问题讨论】:

  • 你要找的东西叫做序列化
  • 我知道,我阅读了有关序列化的信息,然后将其写入普通的 ASCII 文件中......但我在学校需要这个,我真的不知道我在这里做错了什么:(
  • 考虑提供更有意义的标题

标签: c++ file class binary


【解决方案1】:

例如,类的序列化包含在 boost 包中。

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

我认为您实际上并不想自己实现这些功能。

【讨论】:

    【解决方案2】:

    您不能简单地用 C++ 写出类的二进制映像,尤其是包含指针和非 POD 成员的类。一旦你的数据有间接性,简单地写出内存映像就行不通了,既因为只写出类的内存映像不包括指向的数据,又因为为了让它工作你会必须将所有数据(包括指向的数据)加载到保存它们时它们所在的完全相同的内存位置。这并不容易(委婉地说)。

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

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

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

    【讨论】:

      【解决方案3】:

      你必须使用 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多