如何在c ++中更新文件中的记录?

时间:2013-10-20 10:40:45

标签: c++

在下面提到的功能代码中。我无法在文件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";                 
 }
 }

1 个答案:

答案 0 :(得分:0)

这里有很多问题。首先,updatedata是一个 std::ifstream,这意味着它没有像write这样的功能 或seekp。其次,你已经在文本模式下打开它,所以你无法寻求 到文件中的任意位置;你只能寻求开始 或结束,或tellgtellp返回的职位。 (否则这是未定义的行为。)你必须记住 在每个read之前的位置,并从那里开始工作。)第三,你没有表现出来 account的定义,但一般来说,你不能使用 istream::readostream::write直接在该类型的对象上: 你必须使用中间格式化输出格式并解析输入 缓冲。

编辑:

我刚注意到你实际上是第二次打开文件了 写作。这不能因为几个原因而起作用,至少也是如此 其中一些系统不允许使用write打开文件 访问文件是否已在其他位置打开。除此之外:你打开 使用std::ios_base::app,这意味着所有写入都将附加到 文件的结尾,无论位置标记在何处。

总结:

  • 您需要使用std::fstream
  • 您需要在每次阅读之前记住位置(使用tellg, 如果你想写,请回头看看。
  • 您需要为数据使用中间缓冲区。 (这可能不是 必要如果 1)读取和写入数据的程序是 使用相同的编译器,使用相同的选项编译 机器,在相同的操作系统下运行,以及2)数据结构是纯粹的 荚。在编写良好的C ++中,这些条件几乎从未得到满足。)