Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从文件中读取值、更改值和更新文件_C++_File Io - Fatal编程技术网

C++ 从文件中读取值、更改值和更新文件

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

我正在做一个简单的工资申请。我有一个包含4个选项的菜单和一个名为“shop account”的文本文件,其中只包含值100。 对于选项1,假设用户能够从该100转账一笔金额。用户应该能够进行多次交易,但不能透支帐户

目前,我刚刚打开文件,将值100声明为int“balance”,然后要求用户输入要转移的金额(“NewAmount”),然后简单地减去它。但是,这只适用于一个事务

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,在这种特殊情况下,它的使用恰好是毫无意义的。