【问题标题】:C++ fstream write/read into objectC++ fstream 写入/读取到对象
【发布时间】:2012-01-24 12:46:03
【问题描述】:

我有这些 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 的值时,该值不正确。我该如何解决?

【问题讨论】:

  • 你能说明你是如何打开文件的吗?
  • fstream fcorso("corso.dat",ios::in|ios::binary);
  • 看起来你写了一个结构的字节,其中包含一个指向你真正想要的数据的指针。也就是说,您可能想要写入此指针指向的数据。也就是说,请注意写一堆字节不是二进制格式。它是一组非结构化的字节,迟早会给你带来问题,尽管它可能在短期内起作用,对系统、编译器或平台的任何更改都可能使数据变得无用。您应该使用格式化的读取和写入,如有必要,使用二进制格式。

标签: c++ fstream


【解决方案1】:

你的问题是指针

   istruttore* ist;

如果在程序的同一运行过程中将其写出并立即再次读入,则指向的对象可能仍然存在。

如果您保存文件并稍后再读入,则istruttore 对象很可能在其他地方。

【讨论】:

  • 从二进制文件读取后,我在屏幕上打印:cout&lt;&lt;tmpcorso&lt;&lt;endl&lt;&lt;endl; 和 操作员朋友 ostream&amp; operator &lt;&lt; (ostream&amp; out, const corso&amp; corsoapp){ out&lt;&lt;" ID del corso: "; out&lt;&lt;corsoapp.id_corso; out&lt;&lt;"\n nome del corso: "; out&lt;&lt;corsoapp.nomecorso; out&lt;&lt;"\n costo del corso mensile: "; out&lt;&lt;"\n Istruttore"; out&lt;&lt;corsoapp.ist.getnome(); return out; } 但我在 'out
【解决方案2】:

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

请注意,如果您关注Claudio Pomo 的评论并且您的代码出现 可以工作,它仍然会导致未定义的行为(阅读详细信息in the link I already provided

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多