C++ c++;文件处理-类对象

C++ c++;文件处理-类对象,c++,C++,下面的代码读取3 obj并将其写入文件。 但是,我无法使用下面的代码正确检索对象。 数据重复且不整齐 plz帮助 旧代码: #include<fstream.h> #include<conio.h> class mail { public: char un[25]; // user name char pd[25]; // passsword void reg(int); } obj[5];

下面的代码读取3 obj并将其写入文件。 但是,我无法使用下面的代码正确检索对象。 数据重复且不整齐

plz帮助

旧代码:

#include<fstream.h>
#include<conio.h>

class mail
{
  public:
    char un[25];             // user name
    char pd[25];             // passsword

    void reg(int);

} obj[5];

void mail::reg(int k)
{
  int i;
  i=k;

  clrscr();
  cout<<"Enter user name ( enter unique name )\n";
  cin>>un;


  cout<<"Enter password\n";
  cin>>pd;

  ofstream filout;
  filout.open("email",ios::app||ios::binary);
  if(!filout)
  {
    cout<<"cannot open file\n";
  }
  else
  {
    cout<<"\n "<<i;
    filout.write((char *)&obj[i],sizeof(mail));
    filout.close();
  }

  cout<<"You are now registered. \n";
  getch();

}        // end of sign up or register func

void main()
{

  int t;
  clrscr();
  obj[0].reg(0);
  obj[1].reg(1);
  obj[2].reg(2);

  mail obj2;

  ifstream filein;
  filein.open("email",ios::in||ios::binary);
  if(!filein)
  {
    cout<<"Unable to open file to read\n";
  }
  else
  {
    while(!filein.eof())
    {

      filein.read((char *)&obj2,sizeof(obj2));

      cout<<"username "<<obj2.un<<" passwword "<<obj2.pd<<"\n";
    }
    filein.close();
  }
  getch();

}
#包括
#包括
班级邮件
{
公众:
char un[25];//用户名
char pd[25];//密码剑
无效注册(内部);
}obj[5];
无效邮件::reg(int k)
{
int i;
i=k;
clrsc();
库顿;
coutpd;
流的流出;
filout.open(“email”,ios::app | | ios::binary);
如果(!filout)
{

如果存在不正确的文件循环,EOF()循环是一种不好的做法,通常会导致未定义的行为,正确的循环如下所示:

filein.read((char *)&obj2,sizeof(obj2));
while(filein)
{
    cout<<"username "<<obj2.un<<" passwword "<<obj2.pd<<"\n";
    filein.read((char *)&obj2,sizeof(obj2));
}
filein.read((char*)&obj2,sizeof(obj2));
while(filein)
{

coutCopy粘贴代码,高亮显示它,然后按Ctrl+K。从不使用
void main
,main始终返回int。删除所有多余的空格,以使内容更易于阅读。从不使用
eof()
。这不正确。
ios::in | | ios::binary
应该是
ios::in | ios::binary
,这些标志是按位或组合在一起的,而不是按逻辑或按需再次查看4sleep的答案:在读取和打印之间不检查
filein
是否良好。读取最后一个元素时,状态不会变差(这工作正常),但当您尝试(并且失败)读取另一个不存在的元素时。在这种情况下,读取失败,您打印未更改的
obj2值
while(filein)
while(!filein.eof())一样糟糕
如何正确构造文件循环?我已经几个月没有使用这种方法出现任何问题了。这要好得多。但我仍然面临问题,请参见更新qn@Need4Sleep将test.txt设为4字节长。我得到的输出是2,这显然是错误的。循环的问题是它进行了读取,但它没有检查读取成功-非常类似于
while(!f.eof())
版本。正确的形式应该是f.ex.
while(filein.read((char*)&obj2,sizeof(obj2))
filein.read((char *)&obj2,sizeof(obj2));
while(filein)
{
    cout<<"username "<<obj2.un<<" passwword "<<obj2.pd<<"\n";
    filein.read((char *)&obj2,sizeof(obj2));
}