C++: обработка файлов: сопоставление последовательных файлов

У меня есть небольшая проблема. У меня есть три файла: OldMaster, Transaction и NewMaster. Если номера счетов совпадают между OldMaster и Transaction, я обновляю баланс и записываю его в NewMaster. Если они не совпадают, я записываю исходную информацию об учетной записи из OldMaster в NewMaster и отображаю ошибку.

В файле OldMaster есть 4 счета и 4 счета в файле Transactions. По какой-то причине моя программа не обрабатывает четвертую (последнюю) учетную запись/транзакцию в каждом файле, а NewMaster не получает данные.

int accountNumber
int accountNum;
string lastName;
string firstName;
float currentBalance;
float dollarAmount;

inOldMaster >> accountNumber >> firstName >> lastName >> currentBalance;
inTransaction >> accountNum >> dollarAmount;

while ( !inOldMaster.eof() && !inTransaction.eof() )
{
    if ( accountNumber == accountNum )
    {
        currentBalance += dollarAmount;
        outNewMaster << accountNum << " " << firstName << " " << lastName << " " 
                     << currentBalance << endl;
    } 
    else if (accountNumber != accountNum)
    {
        outNewMaster << accountNumber << " " << firstName << " " << lastName << " " 
            << currentBalance << endl;
        cout << "Unmatched transaction record for account number: " << accountNum 
            << endl;
    }

    inOldMaster >> accountNumber >> firstName >> lastName >> currentBalance;
    inTransaction >> accountNum >> dollarAmount;
}

person Eric Francis    schedule 28.11.2011    source источник
comment
По каким причинам вам нужно второе «если» в конструкции if ( accountNumber == accountNum )....else **if (accountNumber != accountNum)**? Если accountNumber == accountNum неверно, то accountNumber != accountNum точно верно, проверку делать не нужно.   -  person fogbit    schedule 28.11.2011


Ответы (1)


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

В вашем случае я бы сделал что-то вроде этого:

do
{
    inOldMaster >> accountNumber >> firstName >> lastName >> currentBalance;
    inTransaction >> accountNum >> dollarAmount;

    if (inOldMaster.bad() || inTransaction.bad())
        break;

    // Your old if-statements

} while (inOldMaster.good() && inTransaction.good());
person Some programmer dude    schedule 28.11.2011