C ++ fstream写入/读入对象

时间:2012-01-24 12:46:03

标签: c++ fstream

我有这些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))

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

2 个答案:

答案 0 :(得分:1)

你的问题是指针

   istruttore* ist;

如果你把它写出来并在同一个程序运行期间立即再次读取它,指向的对象可能仍然在那里。

如果您保存文件并在以后阅读,很有可能istruttore对象位于其他地方。

答案 1 :(得分:0)

好吧,只有当对象是POD时,才能将对象写为二进制数据然后再读回来。如果删除用户定义的构造函数和析构函数,则可以使类成为POD。当然,只有当他们没有做任何有用的事情时,你才应该这样做。如果有,那么为什么不使用运算符>><<来读写corso类型的对象?

请注意,如果您按照Claudio Pomo的评论并且代码 工作,则仍会导致未定义的行为(请参阅详细信息{{ 3}})