-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

这里有很多问题。首先,updatedatais a std::ifstream,这意味着它没有write or之类的功能seekp。其次,你已经以文本模式打开它,所以你不能在文件中寻找任意位置;您只能寻找开头或结尾,或寻找由tellgor返回的位置tellp。(否则它是未定义的行为。)您必须记住每个 之前的位置read,并从那里开始工作。)第三,您没有显示 的​​定义account,但一般来说,您不能 直接在以下类型的对象上使用istream::readand :ostream::write您必须使用中间缓冲区格式化输出并解析输入。

编辑:

我刚刚注意到您实际上是第二次打开文件进行写入。这不能工作有几个原因,其中最重要的是如果文件已经在其他地方打开,某些系统将不允许打开具有写访问权限的文件。除此之外:您打开std::ios_base::app,这意味着所有写入都将附加到文件的末尾,无论位置标记之前在哪里。

总之:

  • 您需要使用std::fstream.
  • 您需要在每次读取之前tellg记住位置(使用),如果您想写入,请返回该位置。
  • 您需要为数据使用中间缓冲区。(如果1)读取和写入数据的程序使用相同的编译器,使用相同的选项,在同一台机器上,在相同的操作系统下运行,并且 2)数据结构是纯 POD,则可能不需要. 这些条件在编写良好的 C++ 中几乎从未满足。)
于 2013-10-20T11:07:26.243 回答