在下面提到的功能代码中。我无法在文件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";
}
}
答案 0 :(得分:0)
这里有很多问题。首先,updatedata
是一个
std::ifstream
,这意味着它没有像write
这样的功能
或seekp
。其次,你已经在文本模式下打开它,所以你无法寻求
到文件中的任意位置;你只能寻求开始
或结束,或tellg
或tellp
返回的职位。
(否则这是未定义的行为。)你必须记住
在每个read
之前的位置,并从那里开始工作。)第三,你没有表现出来
account
的定义,但一般来说,你不能使用
istream::read
和ostream::write
直接在该类型的对象上:
你必须使用中间格式化输出格式并解析输入
缓冲。
编辑:
我刚注意到你实际上是第二次打开文件了
写作。这不能因为几个原因而起作用,至少也是如此
其中一些系统不允许使用write打开文件
访问文件是否已在其他位置打开。除此之外:你打开
使用std::ios_base::app
,这意味着所有写入都将附加到
文件的结尾,无论位置标记在何处。
总结:
std::fstream
。tellg
),
如果你想写,请回头看看。