我有这些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 回答
你的问题是指针
如果你把它写出来并在程序的同一次运行中再次立即读取它,那么指向的对象可能仍然存在 .
如果您保存文件并在稍后读取它,则很可能
istruttore
对象位于其他位置 .好吧,将对象写为二进制数据然后将其读回的技巧只有在对象是POD时才能完成 . 如果删除用户定义的构造函数和析构函数,则可以使类成为POD . 当然,只有当你使用运算符
>>
和<<
读取和写入corso
类型的对象时,才应该这样做?请注意,如果您按照
Claudio Pomo
的评论和您的代码 appears 工作,它仍会导致未定义的行为(请阅读详细信息in the link I already provided)