Security Teams



:::
  Ответ в темуСоздание новой темыСоздание опроса

> Подскажите где может быть ошибка?, Хелп! Нужна Ваша помощь!
Mail2k
  Дата 30.11.2007 - 01:12
Цитировать сообщение
Offline



Junior
*

Профиль
Группа: -users-
Сообщений: 38
Пользователь №: 3569
Регистрация: 7.06.2006



Рейтинг:
(0%) -----


Программа при условии того,что в той же папке лежит файл credit.dat запускается и при нажатии одной из указанных в меню цифр должна выполнять опредленные действия:

Код
"1 - store a formatted text file of accounts"    called \"print.txt\" for printing"
       "2 - update an account
       "3 - add a new account
       "4 - delete an account
       "5 - end program


При нажатии цифры 2 просит указать номер обновляемого аккаунта,но после ввода номера акаунта

выдает вот такой глюк:


Код
Enter account to update (1 - 100)
-858993460╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
7374176.00

Enter charge (+) or payment (-):


Когда после этого вводишь запрашиваемый + или минус,то программа уходит в бесконечный цикл

Код

2 - update an account
3 - add a new account
4 - delete an account
5 - end program
? Incorrect choice

Enter your choice
1 - store a formatted text file of accounts
   called "print.txt" for printing
2 - update an account
3 - add a new account
4 - delete an account
5 - end program
? Incorrect choice

Enter your choice
1 - store a formatted text file of accounts
   called "print.txt" for printing
2 - update an account
3 - add a new account
4 - delete an account
5 - end program
? Incorrect choice


При нажатии клавиши 3 программа просит ввести номер нового аккаунта,но почему то после ввода любой из цифр выдает то,что такоей акккаунт уже содержит информацию:
Код

Enter new account number (1 - 100): 4
Account #4 already contains information.


Хотя ни один аккаунт ещё не создан.

При нажатии 4 программа вроде удаляет аккаунт или делает только вид,т.к. аккаунт ещё не создан,но сообщение выдает почему то.

Код
Enter account to delete (1 - 100): 3
Account #3 deleted.


Подскажите в каrом участке кода кроется ошибка?

Код прилагаю:
Цитата

// Fig. 14.15: fig14_15.cpp
// This program reads a random access file sequentially,
// updates data already written to the file, creates new
// data to be placed in the file, and deletes data
// already in the file.
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
#include "clntdata.h"
using namespace std;
int enterChoice();
void textFile( fstream& );
void updateRecord( fstream& );
void newRecord( fstream& );
void deleteRecord( fstream& );
void outputLine( ostream&, const clientData & );
int getAccount( const char * );

enum Choices { TEXTFILE = 1, UPDATE, NEW, DELETE, END };

int main()
{  fstream inOutCredit( "credit.dat", ios::in | ios::out );
   if ( !inOutCredit ) {
      cerr << "File could not be opened." << endl;
      exit ( 1 );
   }
   int choice;
   while ( ( choice = enterChoice() ) != END ) {
      switch ( choice ) {
         case TEXTFILE:
            textFile( inOutCredit ); break;
         case UPDATE:
            updateRecord( inOutCredit ); break;
         case NEW:
            newRecord( inOutCredit ); break;
         case DELETE:
            deleteRecord( inOutCredit ); break;
         default:
            cerr << "Incorrect choice\n"; break;
      }
      inOutCredit.clear();  // resets end-of-file indicator
   }
   return 0;
}
// Prompt for and input menu choice
int enterChoice()
{  cout << "\nEnter your choice" << endl
        << "1 - store a formatted text file of accounts\n"
        << "    called \"print.txt\" for printing\n"
        << "2 - update an account\n"
        << "3 - add a new account\n"
        << "4 - delete an account\n"
        << "5 - end program\n? ";
   int menuChoice;
   cin >> menuChoice;
   return menuChoice;
}
// Create formatted text file for printing
void textFile( fstream &readFromFile )
{  ofstream outPrintFile( "print.txt", ios::out );
   if ( !outPrintFile ) {
      cerr << "File could not be opened." << endl;
      exit( 1 );
   }
   outPrintFile << setiosflags( ios::left ) << setw( 10 )
       << "Account" << setw( 16 ) << "Last Name" << setw( 11 )
       << "First Name" << resetiosflags( ios::left )
       << setw( 10 ) << "Balance" << endl;
   readFromFile.seekg( 0 );

   clientData client;
   readFromFile.read( reinterpret_cast<char *>( &client ),
                      sizeof( clientData ) );

   while ( !readFromFile.eof() ) {
      if ( client.accountNumber != 0 )
         outputLine( outPrintFile, client );

      readFromFile.read( reinterpret_cast<char *>( &client ),
                         sizeof( clientData ) );
   }
}
// Update an account's balance
void updateRecord( fstream &updateFile )
{  int account = getAccount( "Enter account to update" );
   updateFile.seekg( ( account - 1 ) * sizeof( clientData ) );

   clientData client;
   updateFile.read( reinterpret_cast<char *>( &client ),
                    sizeof( clientData ) );
   if ( client.accountNumber != 0 ) {
      outputLine( cout, client );
      cout << "\nEnter charge (+) or payment (-): ";

      float transaction;    // charge or payment
      cin >> transaction;   // should validate
      client.balance += transaction;
      outputLine( cout, client );
      updateFile.seekp( ( account-1 ) * sizeof( clientData ) );
      updateFile.write(
         reinterpret_cast<const char *>( &client ),
         sizeof( clientData ) );
   }
   else  cerr << "Account #" << account
              << " has no information." << endl;
}
// Create and insert new record
void newRecord( fstream &insertInFile )
{  int account = getAccount( "Enter new account number" );
   insertInFile.seekg( ( account-1 ) * sizeof( clientData ) );

   clientData client;
   insertInFile.read( reinterpret_cast<char *>( &client ),
                      sizeof( clientData ) );
   if ( client.accountNumber == 0 ) {
      cout << "Enter lastname, firstname, balance\n? ";
      cin >> client.lastName >> client.firstName
          >> client.balance;
      client.accountNumber = account;
      insertInFile.seekp( ( account - 1 ) *
                          sizeof( clientData ) );
      insertInFile.write(
         reinterpret_cast<const char *>( &client ),
         sizeof( clientData ) );
   }
   else  cerr << "Account #" << account
              << " already contains information." << endl;
}
// Delete an existing record
void deleteRecord( fstream &deleteFromFile )
{  int account = getAccount( "Enter account to delete" );
   deleteFromFile.seekg( (account-1) * sizeof( clientData ) );

   clientData client;
   deleteFromFile.read( reinterpret_cast<char *>( &client ),
                        sizeof( clientData ) );
   if ( client.accountNumber != 0 ) {
      clientData blankClient = { 0, "", "", 0.0 };

      deleteFromFile.seekp( ( account - 1) *
                            sizeof( clientData ) );
      deleteFromFile.write(
         reinterpret_cast<const char *>( &blankClient ),
         sizeof( clientData ) );
      cout << "Account #" << account << " deleted." << endl;
   }
   else cerr << "Account #" << account << " is empty." << endl;
}
// Output a line of client information
void outputLine( ostream &output, const clientData &c )
{  output << setiosflags( ios::left ) << setw( 10 )
          << c.accountNumber << setw( 16 ) << c.lastName
          << setw( 11 ) << c.firstName << setw( 10 )
          << setprecision( 2 ) << resetiosflags( ios::left )
          << setiosflags( ios::fixed | ios::showpoint )
          << c.balance << '\n';
}
// Get an account number from the keyboard
int getAccount( const char *prompt )
{  int account;
   do { cout << prompt << " (1 - 100): ";
        cin >> account;
      } while ( account < 1 || account > 100 );
   return account;
}




Цитата

// Fig. 14.11: clntdata.h
// Definition of struct clientData used in
// Figs. 14.11, 14.12, 14.14 and 14.15.

#ifndef CLNTDATA_H
#define CLNTDATA_H

struct clientData {
   int accountNumber;
   char lastName[ 15 ];
   char firstName[ 10 ];
   float balance;
};
#endif









Это сообщение отредактировал Mail2k - 30.11.2007 - 01:14
PMПисьмо на e-mail пользователю
Top
nameless
Дата 30.11.2007 - 01:25
Цитировать сообщение
Offline



.:Тень:.
******

Профиль
Группа: -experts-
Сообщений: 1745
Пользователь №: 18
Регистрация: 19.02.2005



Рейтинг:
(90%) XXXXX


Где то у тебя есть переполнение. Настоятельно рекомендую научится самому в своих программах искать ошибки, и самое главное чётко представлять себе, что делает каждая строчка твоего кода.


--------------------
Мы расправим крылья
PM
Top
Mail2k
Дата 30.11.2007 - 17:06
Цитировать сообщение
Offline



Junior
*

Профиль
Группа: -users-
Сообщений: 38
Пользователь №: 3569
Регистрация: 7.06.2006



Рейтинг:
(0%) -----


Цитата (vxk7m @ 30.11.2007 - 01:25)
Где то у тебя есть переполнение. Настоятельно рекомендую научится самому в своих программах искать ошибки, и самое главное чётко представлять себе, что делает каждая строчка твоего кода.

да в том то и дело,что это не моя программа. Хотелось разобраться в этом коде,т.к. очень нужен в дальнейшем использовании.

Это сообщение отредактировал Mail2k - 30.11.2007 - 17:06
PMПисьмо на e-mail пользователю
Top

Опции темы Ответ в темуСоздание новой темыСоздание опроса