C++ 从文件中读取值、更改值和更新文件
我正在做一个简单的工资申请。我有一个包含4个选项的菜单和一个名为“shop account”的文本文件,其中只包含值100。 对于选项1,假设用户能够从该100转账一笔金额。用户应该能够进行多次交易,但不能透支帐户 目前,我刚刚打开文件,将值100声明为int“balance”,然后要求用户输入要转移的金额(“NewAmount”),然后简单地减去它。但是,这只适用于一个事务C++ 从文件中读取值、更改值和更新文件,c++,file-io,C++,File Io,我正在做一个简单的工资申请。我有一个包含4个选项的菜单和一个名为“shop account”的文本文件,其中只包含值100。 对于选项1,假设用户能够从该100转账一笔金额。用户应该能够进行多次交易,但不能透支帐户 目前,我刚刚打开文件,将值100声明为int“balance”,然后要求用户输入要转移的金额(“NewAmount”),然后简单地减去它。但是,这只适用于一个事务 int read_balance (void) { fstream f; f.open("shop-ac
int read_balance (void)
{
fstream f;
f.open("shop-account.txt");
f >> balance;
f.close();
return balance;
}
void write_balance (int balance)
{
fstream f;
f.open("shop-account.txt");
f << balance;
f.close();
}
当我返回并尝试进行第二次转移时,它再次从100中减去,而不是更新的金额。所以我想知道是否有人知道我将如何在每次交易后更新文件
int balance;
int NewAmount;
fstream infile;
infile.open("shop-account.txt");
infile >> balance;
do {
cout << "1. Transfer an amount" <<endl;
cout << "2. List recent transactions"<<endl;
cout << "3. Display account details and current balance"<<endl;
cout << "4. Quit" << endl;
cout << "Please enter menu number"<<endl;
cin >> selection;
switch(selection) {
case 1:
cout << "You have choosen to transfer an amount" << endl;
cout << "How much do you wish to transfer from the shop account?"<<endl;
cin >> NewAmount;
cout << balance - NewAmount << endl;
break;
case 2:
cout << "Here are you're recent transactions" <<endl;
cout << "" << endl;
cout << "" << endl;
break;
case 3:
cout << "The account names is:" << name << endl;
cout << "The account number is:" << number << endl;
cout << "The current balance is\n\n" << endl; //Need to get cuurent balance still
break;
case 4:
return 0;
break;
default:
cout << "Ooops, invalid selection!" << endl;
break;
}
} while(selection != 4);
system("pause");
return 0;
}
int平衡;
int NewAmount;
河道充填;
填写开立账户(“shop account.txt”);
填充>>平衡;
做{
cout要“更新”一个文件,您必须用正在“更新”的已更改部分写入整个文件。最有效的方法是将文件映射到内存中(mmap()
在Unix中),在内存中更新文件,并允许操作系统将更改后的版本刷新回磁盘(定期或关闭).基本上,您的文件只包含一个数据,因此进行部分更新毫无意义
你所要做的就是一开始就阅读它,就像你做的那样,然后在每次做交易时完整地写下来
int read_balance (void)
{
fstream f;
f.open("shop-account.txt");
f >> balance;
f.close();
return balance;
}
void write_balance (int balance)
{
fstream f;
f.open("shop-account.txt");
f << balance;
f.close();
}
int-read\u余额(无效)
{
fsf;
f、 开立(“shop account.txt”);
平衡;
f、 close();
收益余额;
}
无效写入余额(整数余额)
{
fsf;
f、 开立(“shop account.txt”);
f不,这只是一本书中的练习。我整天都在试图解决这个问题,我完全被难倒了,只需要把它推向正确的方向。这会有多大的效率?如果你在理财,最好不要实现任何自制的缓存系统,因为它可能会在崩溃/断电时丢失一些事务和/或编写不一致的代码状态到磁盘。此外,内存映射I/O远远超出了这样一个简单问题的范围。“自制缓存”?真的吗?我相信Linux实现者一定会着迷于听到它的虚拟内存子系统这样描述。内存映射文件不是什么深奥的技术。它是一个单行程序。调用msync()
如果您需要刷新更改。真的,让操作系统跳过所有这些障碍来读取/写入文件中的4个字节应该是值得的。特别是当您每次写入所述4个字节时都会同步内存映射文件时。如果不深入了解unix特定的int,我相信OP无法处理基本文件I/Oerface,在这种特殊情况下,它的使用恰好是毫无意义的。