首页 文章

C fstream写入/读入对象

提问于
浏览
1

我有这些C头

#include <iostream>
#include "istruttore.h"
#define max 30

using namespace std;
//==============================================================================
class corso
{
  friend ostream& operator << (ostream& out, const corso& corsoapp);
  friend istream& operator >> (istream& in, corso& corso);

  public:
       int getid_corso();
       char* getnomecorso();
       double getcosto();
       char* getdurata(); 
       int getistruttore_id();
       char* getistruttore_name();
       char* getistruttore_surname();
       void setid_corso(int course);
       void setnomecorso(char namecourse[]);
       void setcosto (double pay);
       void setdurata(char duration[]); 
       void set_istruttore(char name[], char surname[], int id, int id_corso);
       corso();
       ~corso();
       istruttore* ist;
   private:
       int id_corso;
       char nomecorso[max];
       double costo;
       char durata[max];
    };



#include <iostream>

#define max 30

using namespace std;
//==============================================================================
class istruttore {
friend ostream& operator <<(ostream& out, const istruttore& istruttoreapp);
friend istream& operator >>(istream& in, istruttore& istruttore);

public:
 int getid_istruttore();
 char* getnome();
 char* getcognome();
 int getid_corso();
 void setid_istruttore(int idistruttore);
 void setnome(char name[]);
 void setcognome(char surname[]);
 void setid_corso(int idcorso);
 istruttore();
 ~istruttore();
protected:
 int id_istruttore;
 char nome[max];
 char cognome[max];
 int id_corso;
  };

我已经为两个标头实现了所有方法 . 我想以这种方式编写二进制文件:

fcliente.write(reinterpret_cast<const char*>(&tmpcorso),sizeof(tmpcorso));

其中 tempcorso 是corso类型的对象 . 写作还可以,但阅读不合适 . 我尝试使用此代码读取相同的二进制文件

fcorso.read(reinterpret_cast<char*>(&tmpcorso),sizeof(tmpcorso))

但当我在 tmpcorso 中查看 istruttore 的值时,该值不合适 . 我如何解决它?

2 回答

  • 0

    你的问题是指针

    istruttore* ist;
    

    如果你把它写出来并在程序的同一次运行中再次立即读取它,那么指向的对象可能仍然存在 .

    如果您保存文件并在稍后读取它,则很可能 istruttore 对象位于其他位置 .

  • 1

    好吧,将对象写为二进制数据然后将其读回的技巧只有在对象是POD时才能完成 . 如果删除用户定义的构造函数和析构函数,则可以使类成为POD . 当然,只有当你使用运算符 >><< 读取和写入 corso 类型的对象时,才应该这样做?

    请注意,如果您按照 Claudio Pomo 的评论和您的代码 appears 工作,它仍会导致未定义的行为(请阅读详细信息in the link I already provided

相关问题