⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 operclient.h

📁 C++案例教程源代码
💻 H
字号:
#ifndef OPERCLIENT_H
#define OPERCLIENT_H
#include <iostream>
#include <fstream>
using namespace std;
#include "clientData.h"  
enum Choices { PRINT = 1, UPDATE, NEW, DELETE, END };
class OperClient
{public:
	void CreateFile();
	int enterChoice();
	void printRecord( fstream& );
	void updateRecord( fstream& );
	void newRecord( fstream& );
	void deleteRecord( fstream& );
	void outputLine( ostream&, const ClientData & );
	int getAccount( const char * const );
};
int OperClient::enterChoice()						//进入选择菜单
{   cout << "\nEnter your choice" << endl<< "1 - store accounts to a formatted text file " << endl
        << "2 - update an account" << endl<< "3 - add a new account" << endl
        << "4 - delete an account" << endl<< "5 - end program\n ";
   int menuChoice;   cin >> menuChoice; 	//输入选项
   return menuChoice;
} 
void OperClient::printRecord( fstream &readFromFile )	//创建格式文本
{	ofstream outPrintFile( "print.txt", ios::out );   	//创建文本文件
//如果创建文件失败,退出程序
	if ( !outPrintFile ) 	{cerr << "File could not be created." << endl;	exit( 1 );	} 
	outPrintFile << left << setw( 10 ) << "Account" << setw( 16 )
		<< "Name" << setw( 11 ) << setw( 10 ) << "Balance" << endl;
   readFromFile.seekg( 0 );					//设置文件位置指针到记录文件开始部分
   ClientData client;
   readFromFile.read( reinterpret_cast< char * >(&client),sizeof( ClientData ) );
   while ( !readFromFile.eof() )    			//将所有记录从记录文件中拷贝到文本文件
   {  if ( client.getAccountNumber() != 0 )   
         outputLine( outPrintFile, client ); 	//写单个记录
      //继续读记录
      readFromFile.read( reinterpret_cast< char * >(&client), sizeof(ClientData)); 
   } 
} 
void OperClient::updateRecord( fstream &updateFile )			//在记录中更新余额
{  int accountNumber = getAccount( "Enter account to update" );  	//获取更新的帐号
   updateFile.seekg(( accountNumber - 1 ) * sizeof( ClientData ) );//移动指针到正确的位置
   ClientData client;   									//读取记录
   updateFile.read( reinterpret_cast< char * >( &client ),sizeof( ClientData ) );
   if (client.getAccountNumber() != 0 )    					//更新记录
   {  outputLine( cout, client );
      cout << "\nEnter charge (+) or payment (-): ";      		//提示用户指定
      double transaction; cin >> transaction;					//charge 或 payment
      double oldBalance = client.getBalance();      			//更新记录余额
      client.setBalance( oldBalance + transaction );
      outputLine( cout, client );
      updateFile.seekp(( accountNumber - 1 ) * sizeof( ClientData ));//移动指针到正确位置
   	  //用新的记录覆盖旧的记录
      updateFile.write(reinterpret_cast< const char * >( &client),sizeof( ClientData ) ); 
   } 
   else   										//如果不存在帐号显示错误信息
      cerr << "Account #" << accountNumber<< " has no information." << endl;
} 
void OperClient::newRecord( fstream &insertInFile )		//创建和插入记录
{  int accountNumber = getAccount( "Enter new account number" );   //获取创建的帐号
   insertInFile.seekg(( accountNumber - 1 ) * sizeof( ClientData ) );
   ClientData client;
   insertInFile.read( reinterpret_cast< char * >( &client ), sizeof( ClientData ) );
   if ( client.getAccountNumber() == 0 )    			//如果记录不存在,则创建记录
   {  char Name[ 15 ];      double balance;
      cout << "Enter name, balance\n? ";   cin >> setw( 15 ) >> Name >> balance;
      client.setName( Name );      client.setBalance( balance );
      client.setAccountNumber( accountNumber );
      insertInFile.seekp( ( accountNumber - 1 ) *sizeof( ClientData ) );
      insertInFile.write( reinterpret_cast< const char * >( &client ), sizeof( ClientData ) );
   } 
   else   cerr << "Account #" << accountNumber<< " already contains information." << endl;
} 
void OperClient::deleteRecord( fstream &deleteFromFile ) //删除已经存在的记录
{  int accountNumber = getAccount( "Enter account to delete" );
   deleteFromFile.seekg(( accountNumber - 1 ) * sizeof( ClientData ) );
   ClientData client;
   deleteFromFile.read( reinterpret_cast< char * >( &client ), sizeof( ClientData ) );
   if ( client.getAccountNumber() != 0 )    			//如果记录存在,则删除记录
   {   ClientData blankClient;
      deleteFromFile.seekp( ( accountNumber - 1 ) * sizeof( ClientData ) );
      //用空白记录替换已经存在的记录
      deleteFromFile.write(reinterpret_cast< const char * >( &blankClient ),
                           sizeof( ClientData ) );
      cout << "Account #" << accountNumber << " deleted.\n";
   }
   else  cerr << "Account #" << accountNumber << " is empty.\n";
} 
void OperClient::outputLine( ostream &output, const ClientData &record ) //显示单个记录
{   output << left << setw( 10 ) << record.getAccountNumber()
          << setw( 16 ) << record.getName().data()
          << setw( 10 ) << setprecision( 2 ) << right << fixed 
          << showpoint << record.getBalance() << endl;
}
int OperClient::getAccount( const char * const prompt )				//获取帐号
{  int accountNumber;
   do {  cout << prompt << " (1 - 100): "; cin >> accountNumber;
   } while ( accountNumber < 1 || accountNumber > 100 );
   return accountNumber;
} 
void OperClient::CreateFile()
{  int accountNumber;
   char Name[ 15 ];   double balance;
   ofstream outCredit( "credit.dat", ios::binary );
   if ( !outCredit ) {  cerr << "File could not be opened." << endl; exit( 1 );   } 
   cout << "Enter account number (1 to 100, 0 to end input):\n ";
   ClientData client;
   cin >> accountNumber;   										//指定帐号
   client.setAccountNumber( accountNumber );
   //输入信息拷贝到文件中
   while ( client.getAccountNumber()> 0 &&client.getAccountNumber() <= 100) 
   {  cout << "Enter name, balance\n? ";   cin >> setw( 15 ) >> Name;   cin >> balance;
      client.setName( Name );      client.setBalance( balance );
      //在文件中查找记录位置
      outCredit.seekp((client.getAccountNumber()-1) * sizeof(ClientData));
      //将信息写入文件
      outCredit.write(reinterpret_cast< const char * >( &client),sizeof(ClientData));
      cout << "Enter account number\n? ";   cin >> accountNumber;    //指定另一个帐号
      client.setAccountNumber( accountNumber );
   }
} 
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -