从文件中读取值,更改值和更新文件

时间:2014-01-14 20:42:54

标签: c++ file-io

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

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

当我回去尝试进行第二次转移时,它会再次从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;
}

3 个答案:

答案 0 :(得分:2)

基本上,您的文件只包含一个数据,因此进行部分更新根本没有意义。

您所要做的就是在开头阅读,就像您一样,并在每次交易时将其完全写回来。

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();
}

然后在你的代码中:

cout << "You have choosen to transfer an amount" << endl;
cout << "How much do you wish to transfer from the shop account?"<<endl;
cin >> NewAmount;
balance -= NewAmount;
write_balance (balance);
cout << balance << endl;

答案 1 :(得分:0)

要“更新”文件,您必须编写整个文件,并更改您正在“更新”的部分。

答案 2 :(得分:0)

执行此操作的最有效方法是将内存映射文件(在Unix中为mmap()),在内存中更新并允许操作系统将更改后的版本刷新回磁盘(定期或关闭) 。