Member 13574475 Ответов: 2

Почему программа сохраняет входные данные на неоднозначном языке и как это исправить?


Я создал банковскую систему управления на языке C++, используя Dev C++. Программа работает без каких-либо ошибок; она сохраняет всю предоставленную ей информацию в файле с именем record.txt. Он также отображает информацию, сохраненную в файле. Единственная проблема заключается в том, что когда я вручную открываю файл record.txt; я нахожу все данные в двусмысленном языке.

//***************************************************************
//                   HEADER FILES USED IN PROJECT
//****************************************************************

#include<iostream>               
#include<fstream>                 
#include<cctype>                  
#include<iomanip>                
#include<time.h>                 
using namespace std;

//***************************************************************
//                   CLASS USED IN PROJECT
//****************************************************************

class account
{
int acno;
char name[50];
int deposit;
char type;
public:
void create_account();                //function to get data from user
void show_account() const;            //function to show data on screen
void modify();                        //function to add new data
void dep(int);                        
void draw(int);                         
void report() const;                   
int retacno() const;                    //function to return account number
int retdeposit() const;              //function to return balance amount
char rettype() const;                //function to return type of account
};         //class ends here

 void account::create_account()
 {
cout<<"Account Number:  ";
cin>>acno;
cout<<"\nAccount Holder's Name:  ";
cin.ignore();
cin.getline(name,50);
cout <<"\nType Of Account (C for Current and S for Saving):  " ;
cin >> type;
type=toupper(type);
while (type != 'C' && type != 'S' && type!='c' && type!='s')
{
    cout<<"\n\nInvalid Input!";
    cout<<"\nKindly Type (C for Current and S for Saving):  ";
    cin>>type;
    type=toupper(type);
}
while (!((type=='C' || type=='c') && deposit>=1000) && !((type=='S' || type=='s') && deposit>=500))
{
    cout<<"\nOpening Amount >=1000 for Current and >=500 for Saving:  ";
    cin>>deposit;
    if((type=='C' || type=='c') && deposit>=1000)
    {
        cout<<"\n\n\nAccount Created..";
    }
    else if((type=='S' || type=='s') && deposit>=500)
    {
        cout<<"\n\n\nAccount Created..";
    }
    else 
    {
        cout<<"\n\nNot Valid Opening Amount!";
    }
}
cout<<"\n\n";
cin.get();
 }


void account::show_account() const
{
cout<<"\nAccount No. : "<<acno;
cout<<"\nAccount Holder Name : ";
cout<<name;
cout<<"\nType of Account : "<<type;
cout<<"\nBalance amount : "<<deposit;
}


void account::modify()
{
cout<<"\nAccount No. : "<<acno;
cout<<"\nAccount Holder's Name:  ";
cin.ignore();
cin.getline(name,50);
cout <<"\nType Of Account (C for Current and S for Saving):  " ;
cin >> type;
type=toupper(type);
while (type != 'C' && type != 'S' && type!='c' && type!='s')
{
    cout<<"\n\nInvalid Input!";
    cout<<"\nKindly Type (C for Current and S for Saving):  ";
    cin>>type;
    type=toupper(type);
}
while (!((type=='C' || type=='c') && deposit>=1000) && !((type=='S' || type=='s') && deposit>=500))
{
    cout<<"\nOpening Amount >=1000 for Current and >=500 for Saving:  ";
    cin>>deposit;
    if((type=='C' || type=='c') && deposit>=1000)
    {
        cout<<"\n\n\nAccount Created..";
    }
    else if((type=='S' || type=='s') && deposit>=500)
    {
        cout<<"\n\n\nAccount Created..";
    }
    else 
    {
        cout<<"\n\nNot Valid Opening Amount!";
    }
}
}


void account::dep(int x)
{
deposit+=x;
}

void account::draw(int x)
{
deposit-=x;
}

void account::report() const
{
cout<<setw(2)<<acno<<setw(13)<<name<<setw(15)<<type<<setw(12)<<deposit<<endl;
}

int account::retacno() const
{
return acno;
}

int account::retdeposit() const
{
return deposit;
}

char account::rettype() const
{
return type;
}


//***************************************************************
//      function declaration
//****************************************************************
void write_account();             
void display_sp(int);             
void modify_account(int);           //function to modify record of file
void delete_account(int);           //function to delete record of file
void display_all();         
void deposit_withdraw(int, int);    
void intro();                       //introductory screen function

int main()
{
srand(time(NULL));
char ch;
int num;
intro();
do
{
    system("cls");
    cout<<"\n\n\n\tMAIN MENU";
    cout<<"\n\n\t01. NEW ACCOUNT";
    cout<<"\n\n\t02. DEPOSIT AMOUNT";
    cout<<"\n\n\t03. WITHDRAW AMOUNT";
    cout<<"\n\n\t04. BALANCE ENQUIRY";
    cout<<"\n\n\t05. ALL ACCOUNT HOLDER LIST";
    cout<<"\n\n\t06. CLOSE AN ACCOUNT";
    cout<<"\n\n\t07. MODIFY AN ACCOUNT";
    cout<<"\n\n\t08. EXIT";
    cout<<"\n\n\tSelect Your Option (1-8) ";
    cin>>ch;
    system("cls");
    switch(ch)
    {
    case '1':
        write_account();
        break;
    case '2':
        cout<<"\n\n\tEnter The account No. : "; cin>>num;
        deposit_withdraw(num, 1);
        break;
    case '3':
        cout<<"\n\n\tEnter The account No. : "; cin>>num;
        deposit_withdraw(num, 2);
        break;
    case '4': 
        cout<<"\n\n\tEnter The account No. : "; cin>>num;
        display_sp(num);
        break;
    case '5':
        display_all();
        break;
    case '6':
        cout<<"\n\n\tEnter The account No. : "; cin>>num;
        delete_account(num);
        break;
     case '7':
        cout<<"\n\n\tEnter The account No. : "; cin>>num;
        modify_account(num);
        break;
     case '8':
        if (rand()%2) 
        {
            cout<<"\n\n\tThanks For Using Bank Managemnt System!";
         } else 
         {
            cout<<"\n\n\tThanks, We Are Happy To Have You As Our Customer!";
         }

        break;
     default :cout<<"\a";
    }
    cin.ignore();
    cin.get();
}while(ch!='8');
return 0;
}


void write_account()
{
account ac;
ofstream outFile;
outFile.open("record.txt",ios::binary|ios::app);
ac.create_account();
outFile.write(reinterpret_cast<char *> (&ac), sizeof(account));
outFile.close();
}

void display_sp(int n)
{
account ac;
bool flag=false;
ifstream inFile;
inFile.open("record.txt",ios::binary);
if(!inFile)
{
    cout<<"File could not be open !! Press any Key...";
    return;
}
cout<<"\nBALANCE DETAILS\n";
    while(inFile.read(reinterpret_cast<char *> (&ac), sizeof(account)))
{
    if(ac.retacno()==n)
    {
        ac.show_account();
        cout<<"\n\n";
        flag=true;
    }
}
inFile.close();
if(flag==false)
    cout<<"\n\nAccount number does not exist";
}



void modify_account(int n)
{
bool found=false;
account ac;
fstream File;
File.open("record.txt",ios::binary|ios::in|ios::out);
if(!File)
{
    cout<<"File could not be open !! Press any Key...";
    return;
}
while(!File.eof() && found==false)
{
    File.read(reinterpret_cast<char *> (&ac), sizeof(account));
    if(ac.retacno()==n)
    {
        ac.show_account();
        cout<<"\n\nEnter The New Details of account"<<endl;
        ac.modify();
        int pos=(-1)*static_cast<int>(sizeof(account));
        File.seekp(pos,ios::cur);
        File.write(reinterpret_cast<char *> (&ac), sizeof(account));
        cout<<"\n\n\t Record Updated";
        found=true;
      }
}
File.close();
if(found==false)
    cout<<"\n\n Record Not Found ";
}



void delete_account(int n)
{
account ac;
ifstream inFile;
ofstream outFile;
inFile.open("record.txt",ios::binary);
if(!inFile)
{
    cout<<"File could not be open !! Press any Key...";
    return;
}
outFile.open("temp.txt",ios::binary);
inFile.seekg(0,ios::beg);
while(inFile.read(reinterpret_cast<char *> (&ac), sizeof(account)))
{
    if(ac.retacno()!=n)
    {
        outFile.write(reinterpret_cast<char *> (&ac), sizeof(account));
    }
}
inFile.close();
outFile.close();
remove("record.txt");
rename("temp.txt","record.txt");
cout<<"\n\n\tRecord Deleted ..";
}


void display_all()
{
account ac;
ifstream inFile;
inFile.open("record.txt",ios::binary);
if(!inFile)
{
    cout<<"File could not be open !! Press any Key...";
    return;
}
cout<<"\n\n\t\tACCOUNT HOLDER LIST\n\n";
cout<<"====================================================\n";
cout<<"A/c no.      NAME           Type    Balance\n";
cout<<"====================================================\n";
while(inFile.read(reinterpret_cast<char *> (&ac), sizeof(account)))
{
    ac.report();
}
inFile.close();
}


void deposit_withdraw(int n, int option)
{
int amt;
bool found=false;
account ac;
fstream File;
File.open("record.txt", ios::binary|ios::in|ios::out);
if(!File)
{
    cout<<"File could not be open !! Press any Key...";
    return;
}
while(!File.eof() && found==false)
{
    File.read(reinterpret_cast<char *> (&ac), sizeof(account));
    if(ac.retacno()==n)
    {
        ac.show_account();
        if(option==1)
        {
            cout<<"\n\n\tTO DEPOSITE AMOUNT ";
            cout<<"\n\nEnter The amount to be deposited:  ";
            cin>>amt;
            ac.dep(amt);
        }
        if(option==2)
        {
            cout<<"\n\n\tTO WITHDRAW AMOUNT ";
            cout<<"\n\nEnter The amount to be withdraw";
            cin>>amt;
            int bal=ac.retdeposit()-amt;
            if((bal<500 && ac.rettype()=='S') || (bal<1000 && 
 ac.rettype()=='C'))
                cout<<"Insufficience balance";
            else
                ac.draw(amt);
          }
        int pos=(-1)*static_cast<int>(sizeof(ac));
        File.seekp(pos,ios::cur);
        File.write(reinterpret_cast<char *> (&ac), sizeof(account));
        cout<<"\n\n\t Record Updated";
        found=true;
       }
     }
File.close();
if(found==false)
    cout<<"\n\n Record Not Found ";
}



void intro()
{
cout<<"\n\n\t\t\t    CSP GROUP PROJECT\n";
cout<<"\t\t****************************************\n";
cout<<"\n\n\n\n\n\t\t****************************************\n";
cout<<"\t\t\tBANK   MANAGEMNET   SYSTEM\n";
cout<<"\t\t****************************************\n\n\n\n";
cout << "\t\t   Students' Name:       \n"<< endl;
cout<< " \t\t   Instructor's Name:    Sir Usman\n"<< endl;
cout << "\t\t   College's Name:       NUST-PNEC\n"<< endl;

cin.get();
}


Что я уже пробовал:

Я попытался удалить все бинарные команды ios::, но все равно, когда я вручную открываю файл, я получаю текст, написанный на нечеловеческом языке.

2 Ответов

Рейтинг:
2

Rick York

Я думаю, что ваша проблема вызвана этими строками :

outFile.open("record.txt",ios::binary|ios::app);

Это означает открытие файла в двоичном режиме. Попробуйте открыть его в текстовом режиме.

Впрочем, я могу и ошибаться. :)


CPallini

5.

Member 13574475

что случилось?

CPallini

Ничего драматического: я поддержал его ответ и дал ему (и вам) знать. :-)

Рейтинг:
2

CPallini

Ваша ошибка была правильно замечена Рик-Йорке.
В любом случае, ваш код очень похож на Си. Я привожу (очень упрощенный) пример другого подхода:

#include <iostream>
#include <fstream>
using namespace std;

enum class AccountType
{
  Current,
  Deposit
};

class Account
{
  string name;
  AccountType type;
public:
  Account(string name, AccountType type):
  name(name), type(type)
  {}
  friend ostream & operator << (ostream & os, const Account & account);
  friend istream & operator >> (istream & is, Account & account);
};

ostream & operator << (ostream & os, const Account & account)
{
  os << account.name << " " << static_cast<int>(account.type) << endl;
  return os;
}

istream & operator >> (istream & is, Account & account)
{
  int type;
  is >> account.name >> type;
  account.type = static_cast<AccountType>(type);
  return is;
}


int main()
{
  Account account_foo("foo", AccountType::Deposit);
  {
    ofstream ofs("foo.txt");
    ofs << account_foo;
  }
  Account account_boo("boo", AccountType::Current);
  ifstream ifs("foo.txt");
  ifs >> account_boo;
  cout << account_boo << endl;
}