2014-01-14 3 views
1

Я работаю над простым применением заработной платы. У меня есть меню с 4 вариантами и текстовый файл, называемый «shop-account», который просто содержит значение 100. Для варианта один пользователь должен иметь возможность передавать сумму из этого 100. Пользователь должен иметь возможность сделать несколько транзакций, но не может переупаковать учетную запись.Чтение значения из файла, изменение значения и файла обновления

В настоящее время я только что открыл файл и объявил значение 100 для «баланса», а затем попросил пользователя ввести сумму, подлежащую передаче («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; 
} 
+0

Является ли это домашнее задание? –

+0

Нет, это просто упражнение из книги. Я пытался разобраться в этом весь день, и я полностью закрыт, просто нужно нажать в правильном направлении. – user3057816

ответ

0

«обновить» файл, вы должны написать весь файл с части изменен, что вы «обновление».

0

Самый эффективный способ сделать это - это скопировать карту в файл (mmap() в Unix), обновить его в памяти и позволить ОС сбрасывать измененную версию обратно на диск (периодически или по закрытию).

+1

Как это будет эффективно? Если вы работаете с деньгами, лучше не внедряйте какую бы то ни было встроенную систему кеша, которая могла бы потерять некоторые транзакции при сбое при сбое/сбое и/или записать несогласованное состояние на диск. Кроме того, операции ввода/вывода с отображением памяти выходят за рамки такого простого вопроса. –

+0

«Домашний кеш»? В самом деле? Я уверен, что разработчики Linux были бы увлечены, если бы услышали описанную выше подсистему виртуальной памяти. Файлы с отображением памяти - это едва ли какая-то эзотерическая техника. Это однострочный. И вызовите 'msync()', если вам нужно сбросить изменения. –

+0

Действительно, заставить ОС перепрыгнуть через все эти обручи, чтобы читать/писать 4 байта в файле, стоит того. Особенно, когда ваш файл с отображением памяти будет синхронизироваться каждый раз, когда вы пишете упомянутые 4 байта. Я уверен, что OP не смог справиться с базовыми файловыми вводами-выводами без глубокого понимания интерфейса, специфичного для unix, использование которого в данном конкретном случае бессмысленно. –

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; 
Смежные вопросы