0

書き込み/読み取りで適切な結果が得られません。

2 番目と 3 番目のレコードが正しく表示されない理由を教えてください。

また、バイナリ ファイルに含まれるレコードの数を知る方法はありますか?

以下のコードをご覧ください

  #include <iostream.h>
  #include <fstream.h>
  #include <string.h>

  enum Ticket_type { ADULT, CHILD, STUDENT, SENIOR, FREE, SPECIAL };

  typedef struct transaction_stru
  {
    char  ID[10];
    int   tariff;
    Ticket_type  tickettype;
    int   qty;
    float total;
  }transaction_t;

 int main () {    
   // Attempt to open it for reading.
   fstream fs("trans.dat", ios::in);
   if (!fs)
      fs.open("trans.dat", ios::out | ios::binary | ios::app);     
   else{
     fs.close(); // File exists; close and reopen for write.
     transaction_t dailytrans[3];    
     dailytrans[0] = {"00001", 20, STUDENT, 1, 20.00 };
     dailytrans[1] = {"00002", 30, ADULT, 2, 60.00 };
     dailytrans[2] = {"00003", 30, SPECIAL, 3, 30.00 };    
     fs.open("trans.dat", ios::out | ios::binary | ios::app);
     fs.write((char*)&dailytrans,sizeof(dailytrans));
     fs.close();
    }

    // Let us read the file now
    fs.open("trans.dat", ios::in | ios::binary);
    if(!fs){
      cout << "Error Opening trans.dat";
      //throw SomeFileException;
    }

     transaction_t results[3]; 
     fs.read((char*)&results,sizeof(transaction_stru));
     for (size_t i=0; i < 3; i++)
      {
         cout << results[i].ID << endl;
         cout << results[i].tariff << endl;
         cout << results[i].tickettype << endl;
         cout << results[i].qty  << endl;
         cout << results[i].total << endl;
     }
     return 0;
   }

出力は次のとおりです:-

   00001
   20
   2
   1
   20
   ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠00001
   -858993460
   -858993460
   -858993460
   -1.07374e+008
   ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠00001
   -858993460
   -858993460
   -858993460
   -1.07374e+008
   Press any key to continue
4

1 に答える 1

6

構造体を1つだけ読み書きしているように見えますが、3を出力します。したがって、最後の2つはスタックからのガベージです。

さらに、たとえば問題の特定のコードの場合ID、ディスクファイル内の未定義のバイト(この場合はの初期化されていないバイト)を回避するために、少なくとも、できれば構造体全体をゼロにするのが賢明です。ID

memset (dailytrans, 0, sizeof(dailytrans)); // this depends on dailytrans size being known at compile time
于 2013-02-11T19:51:41.053 に答える