2017-12-14 3 views
-3

私は銀行システム用のコードを書いており、固まってしまって何が間違っているのかを指摘できません。誰でも助けてくれますか?私はループで自分の誤りを指摘することができません

この機能は、バイナリファイル 'Accounts.bat'に保存されているアカウントから残高を変更することでした。ループは決して終わらない。

void transaction :: process() 
    { int bflag=0; 
     if(type==0||type==1) 
     { account b; 
      fstream file("Accounts.bof",ios::binary); 
      file.seekg(0,ios::beg); 
      while(!file.eof()) 
      { file.read((char*)&b, sizeof(b)); 
       if(file.eof()) 
       break; 
       if(b.get_acno()==payee.ac) 
       { if(b.get_balance()>=amount) 
        { b.minus_money(amount); 
         bflag=1; 
         file.seekp(-1*(sizeof(b)),ios::cur); 
         file.write((char*)&b, sizeof(b)); 
         b.out();    //to output account's details 
         getch(); 
         break; 
         cout<<"Money deducted"; 
         getch(); 
        } 
       } 
       file.write((char*)&b, sizeof(b)); 
      } 
      if(bflag==0) 
      cout<<"\n\n\t\tTransaction unsuccessful!!!"; 
      cout<<"\n\t\tCause : Insufficient Balance."; 
      file.close(); 
     } 
     if(type==0||type==2) 
     { account b; 
      fstream file("Accounts.bof",ios::binary); 
      while(!file.eof()) 
      { file.read((char*)&b, sizeof(b)); 
       if(!file.eof()) 
       break; 
       if(b.get_acno()==recieptent.ac) 
       { b.add_money(amount); 
        cout<<"money added"; 
        file.seekp(-1*(sizeof(b)),ios::cur); 
        file.write((char*)&b, sizeof(b)); 
        break; 
       } 
       file.write((char*)&b, sizeof(b)); 
      } 
      file.close(); 
     } 
     if(bflag) 
     cout<<"\n\n\t\tTransaction successful."; 
     getch(); 
    } 
+5

デバッガの使い方を学びます。 – dandan78

+2

http://idownvotedbecau.se/nodebugging/ – Melebius

+1

簡潔で完全な例をまとめて、使用しているコードパスを確認できるように入力してください。あなたはあなたのループは決して終わらないと言っていますが、どちらが終わりですか?マジックナンバーを列挙型に入れて名前を付けることを検討してください。あなたはまたこれを読むべきです:https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrongあなたの使い方が完全に間違っているわけではありませんが、成功したか失敗したかをテストしていることを確認してください。 –

答えて

1

あなたはそれを

を読んでいると同時に、ファイルへの書き込みをしているので、あなたのファイルは今まであなたがあなたのファイルのput位置はあなたを読んで、実際のスポットと一致することを確認したい場合があり、成長していますtellg()とseekp()を明示的に呼び出して記録してください。 これで問題は解決します。とにかくこれは良いコーディングの練習が推奨するものです。

while(!file.eof()) 
{ 
    auto pos = file.tellg();   // note down your spot 
    file.read((char*)&b, sizeof(b)); 
    //... 

    file.seekp(pos);     // overwrite the same exact spot in file. 
    file.write((char*)&b, sizeof(b)); 
} 
関連する問題