0

次のコードは、3 つの obj を読み取り、それらをファイルに書き込みます。ただし、以下のコードを使用してオブジェクトを適切に取得できません。データが重複しており、順序が正しくありません

助けてください

古いコード:

#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();

}

また、stackoverflow にコードを入れる方法を教えてください。コピーペースト後に手動で4つのスペースを入れるのは非常に面倒です

変更後の新しいコード:

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

struct mail
{
    char un[25];             // user name
    char pd[25];             // passsword
    void reg(int);
} obj[5];

void mail::reg(int k)
{
    int 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

int 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) {
            filein.read((char *)&obj2,sizeof(obj2));

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

私はまだ問題に直面しています。私は3つのオブジェクトを書きます。しかし、私は4つの出力レコードを取得しています。最後のものは重複しています。

4

1 に答える 1

2

不適切なファイル ループがあります。EOF() ループは悪い習慣であり、しばしば未定義の動作につながる可能性があります。適切なループは次のようになります。

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

このループの構造により、ファイルは再度読み取る前にファイルの EOF をチェックできますが、eof ループは THEN チェックで eof を読み取るため、最後にジャンクが発生します。

  • fileIn 変数で不適切なフラグが使用されています。' ' 論理ビット単位演算||子の代わりに ' |' 論理 OR 演算子を使用しています。これがエラーの原因である可能性があります。
  • プログラムに問題があり、void main()ここにいるほとんどの人をうんざりさせ、main ALWAYS を返しますint
于 2012-12-18T15:14:21.917 に答える