-4

以下の関数のコードで。ファイル my.dat の残高 (入出金) を更新できません。どこが間違っているのか教えてください。(私は初心者です)。

 void dep_with(int e, int f)
 {
 int amt;
 int recordFind=0;
 account ac;
 ifstream updatedata("E:\\c++ Project\\final thoughts\\my.dat", ios::in|ios::out);
 while(updatedata.read((char*) &ac, sizeof(ac)) && recordFind==0)
 {
          if(ac.get_account()==e)
          {
                  ac.view_account();
                  if(f==1)
                  {
                          cout<<"\nEnter the amount to be deposited";
                          cin>>amt;
                          ac.deposits(amt);        
                  }
                  if(f==2)
                  {
                          cout<<"\nEnter the amount to be withdraw";
                          cin>>amt;
                          ac.withdrawls(amt);
                  }
                  int pos=(-1)*sizeof(ac);
                  ofstream updatedata("E:\\c++ Project\\final thoughts\\my.dat",    ios::in|ios::out|ios::app);
                  updatedata.seekp(pos,ios::cur);
                  updatedata.write((char*) &ac, sizeof(ac));
                  cout<<"\n\n\tRecord Updated";
                  recordFind=1;                      
          }                        

 }
 updatedata.close();
 if(recordFind==0)
 {
                  cout<<"\n\nRecord not Found";                 
 }
 }
4

1 に答える 1

0

ここには多くの問題があります。まず、updatedataは です 。つまり、 やstd::ifstreamのような機能はありません。次に、ファイルをテキスト モードで開いたので、ファイル内の任意の位置をシークできません。シークできるのは、先頭または末尾、または または によって返された位置のみです。(それ以外の場合は未定義の動作です。)各 の前の位置を記憶し、そこから作業する必要があります。)第三に、 の定義を示していませんが、一般に、タイプのオブジェクトに対してand を直接使用することはできません 。中間バッファーを使用して、出力をフォーマットし、入力を解析する必要があります。writeseekptellgtellpreadaccountistream::readostream::write

編集:

書き込みのために実際にファイルを 2 回開いていることに気付きました。これは、いくつかの理由で機能させることができません。ファイルが他の場所で既に開かれている場合、一部のシステムでは書き込みアクセスでファイルを開くことが許可されないためです。それ以外: で開きますstd::ios_base::app。これは、位置マーカーが前にあった場所に関係なく、すべての書き込みがファイルの最後に追加されることを意味します。

要約すれば:

  • を使用する必要がありますstd::fstream
  • 各読み取りの前にtellg( を使用して)位置を記憶し、書き込みたい場合はその位置をシークする必要があります。
  • データには中間バッファーを使用する必要があります。(これは、 1) データを読み書きするプログラムが、同じコンパイラで、同じオプションを使用して、同じマシン上で、同じ OS で実行されてコンパイルされている場合、および 2) データ構造が純粋な POD である場合には必要ない可能性があります。 . これらの条件は、適切に作成された C++ ではほとんど満たされません。)
于 2013-10-20T11:07:26.243 に答える