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

📄 ld_control.cpp

📁 设计模式:工厂模式、单例模式的基本实现
💻 CPP
字号:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#include "LD_Control.h"

#ifndef HLD_FILE_H
#define HLD_FILE_H
#include "LD_File.h"
#endif

#ifndef HLD_FILER_H
#define HLD_FILER_H
#include "LD_FileR.h"
#endif

/************************************************************************/
/*  把整形转换成字符型                                          */
/************************************************************************/
char* LD_Control::intToChar(int _a)
{
	char tempCh='\0';
	int i,sign;
	static char strCh[4];
	for (i=0;i<4;i++)
	{
		strCh[i]='\0';
	}
	
	if ((sign=_a)<0)
	{
		_a=-_a;
	}
	i=0;
	do
	{
		strCh[i++]=(char)(_a%10+'0');
	}while ((_a=_a/10)>0);
	for (i=0;i<(int)(strlen(strCh)/2);i++)
	{
		tempCh=strCh[i];
		strCh[i]=strCh[strlen(strCh)-1-i];
		strCh[strlen(strCh)-1-i]=tempCh;
	}
	return strCh;
	}
/************************************************************************/
/* 添加符号                                                              */
/************************************************************************/
void LD_Control::writeSign(fstream &dd,const char &_a,const int _b)
{
	int i=0;
	while (i<_b)
	{
		dd.put(_a);
		i++;
	}
}
/************************************************************************/
/*  _pEHeadFile是需要保存的文件格式,                            
*	_NumFile是选择保存在那个文件中,0存在exam.ini中,1存在temp.ini中。
*	pHead为要存储问件的指针,在这里是用来存储的中间变量,
*                                 */
/************************************************************************/
void LD_Control::LD_CTR_SaveExam(LD_File *_pEHeadFile,int _NumFile)
{
	fstream pWrite;
	if (_NumFile==0)
	{
		pWrite.open(".\\data\\exam.ini");
	}else if(_NumFile==1)
	{
		pWrite.open("temp.ini");
	}
	if (pWrite.fail())
	{
		cout<<"Open the file fail !"<<endl;
		exit(1);
	}
	LD_File *pHead=_pEHeadFile;	
	while (pHead!=NULL)
	{
		int i=0;
		if (pHead->getTiHao()==1)
		{
			//如果是第一道题,就在前面加上套题标识符
			writeSign(pWrite,'#',31);
			pWrite.write(intToChar(pHead->getTaoTi()),strlen(intToChar(pHead->getTaoTi())));
			writeSign(pWrite,'#',31);
			pWrite.put('\n');			
		}
		//输入题号
		writeSign(pWrite,'*',19);
		pWrite.write(intToChar(pHead->getTiHao()),strlen(intToChar(pHead->getTiHao())));
		writeSign(pWrite,'*',19);
		pWrite.put('\n');			
		//输入答案	[QAnswer]
		char TheAky[]="[QAnswer]";
		pWrite.write(TheAky,strlen(TheAky)).put('\n');
		pWrite.write(pHead->getDaAn().data(),strlen(pHead->getDaAn().data())).put('\n');
		//输入分数	[QScore]
		char TheScore[]="[QScore]";
		pWrite.write(TheScore,strlen(TheScore)).put('\n');
		pWrite.write(intToChar(pHead->getFenShu()),strlen(intToChar(pHead->getFenShu()))).put('\n');		
		//输入题干	[QContent]
		char TheContent[]="[QContent]";
		pWrite.write(TheContent,strlen(TheContent)).put('\n');
		pWrite.write(pHead->getTiGan().data(),strlen(pHead->getTiGan().data())).put('\n');
		//输入选项	[QItem]
		int j=0;							//循环输出选项控制
		char TheQItem[]="[QItem]";
		pWrite.write(TheQItem,strlen(TheQItem)).put('\n');
		while (pHead->getXuanXiang(j).length()!=0)
		{	switch (j)
			{
			case 0:
				pWrite.write("a ",2);
				break;
			case 1:
				pWrite.write("b ",2);
				break;
			case 2:
				pWrite.write("c ",2);
				break;
			case 3:
				pWrite.write("d ",2);
				break;
			case 4:
				pWrite.write("e ",2);
				break;
			case 5:
				pWrite.write("f ",2);
				break;
			case 6:
				pWrite.write("g ",2);
				break;
			default:
				break;
			}
			if (j<=6)
			{
				pWrite.write(pHead->getXuanXiang(j).data(),pHead->getXuanXiang(j).length()).put('\n');
			}
			j++;
			if (j>6)
			{
				break;
			}
		}
		pHead=pHead->getNextP();
	}
	pWrite.close();
}
/************************************************************************/
/*						试题读取
*
*	 *&_NoncePosition 指向当前文件的的唯部 
*	_NumFile是选择在那个文件中读取,0是从exam.ini中读取,1是从temp.ini中读取。
*		LD_File *readHead;
*		LD_File *readFrist;
*		LD_File *readNext;这三个是用来指向被读取文件的指针
*/
/************************************************************************/
LD_File* LD_Control::LD_CTR_ReadExam(int _NumFile,LD_File *&_NoncePosition)
{
	LD_File *readHead=NULL;
	LD_File *readFrist;
	LD_File *readNext;
// 	if(_NoncePosition == NULL)
// 	{
		readNext=readFrist=new LD_File();
// 	}
// 	else
// 	{
// 		readFrist = readNext = _NoncePosition->getNextP();
// 	}
	if (readHead==NULL)
	{
		readHead=readFrist;
	}
	fstream readFileU;
	if (_NumFile==0)
	{
		readFileU.open(".\\data\\exam.ini");
	}else if(_NumFile==1)
	{
		readFileU.open("temp.ini");
	}
	if (readFileU.fail())
	{
		cout<<"Open the file fail !"<<endl;
		exit(1);
	}
	char cArr[100]="";
	int i=0;
	int j=0;
	int countNum=1;//题数
	int countNum2=1;//套数
	int countNum3 = 0;//选项
	int m=0;//读取数字字符的个数
	int sumTaoti=0;//数字字符组成的数
	int sumTihao=0;
	string xuangXiang[7]={""};

	readFileU.getline(cArr,sizeof(cArr),'\n');//读的文件的第一行为后面while 里的if做准备
	i=signJudge(cArr);
	while (readFileU.eof()==false)
	{
		char tmp[2];		
		switch (i)
		{
		case 1:
			readFileU.getline(cArr,sizeof(cArr),'\n');
			i=signJudge(cArr);
			
			while (i==0)
			{
				readFrist->setFL_DaAn(cArr);
				readFileU.getline(cArr,sizeof(cArr),'\n');
				i=signJudge(cArr);
			}
			break;
		case 2:
			readFileU.getline(cArr,sizeof(cArr),'\n');
			i=signJudge(cArr);
		
			while (i==0)
			{
				readFrist->setFL_FenShu(atoi(cArr));
				readFileU.getline(cArr,sizeof(cArr),'\n');
				i=signJudge(cArr);
			}
			break;
		case 3:
			readFileU.getline(cArr,sizeof(cArr),'\n');
			i=signJudge(cArr);
			while (i==0)
			{
				readFrist->setFL_TiGan(cArr);
				readFileU.getline(cArr,sizeof(cArr),'\n');
				i=signJudge(cArr);
			}
			break;
		case 4:
			readFileU.read(tmp,sizeof(tmp));
			readFileU.getline(cArr,sizeof(cArr),'\n');
			i=signJudge(cArr);
			while (i==0)
			{
				xuangXiang[countNum3]=cArr;
				if(readFileU.eof()==false)
				{

					readFileU.read(tmp,sizeof(tmp));
					readFileU.getline(cArr,sizeof(cArr),'\n');
					i=signJudge(cArr);
					countNum3++;
				}else
				{
					i=-1;
				}
			}			
			readFrist->setFL_XuanXiang(xuangXiang,countNum3++);
			break;
		case 5://
			if (countNum2>1)//每到下一题,就新建一个题对象
			{
				countNum3 = 0;
				countNum = 1;
				readNext=readFrist;
				readFrist=new LD_File();
				readNext->setFL_NextP(readFrist);
				readFrist->setFL_PreviousP(readNext);
			}
			m=0;
			for (j=0;j<strlen(cArr);j++)
			{				
				if (cArr[j]>='0'&&cArr[j]<='9')
				{
					m++;
					int nNUm=cArr[j]-'0';
					if (m==1)
					{
						sumTaoti=nNUm;
					}else
					{
						sumTaoti=sumTaoti*(m-1)*10+nNUm;
					}
				}
			 }
			readFrist->setFL_TaoTi(sumTaoti);
			 countNum2++;
			readFileU.getline(cArr,sizeof(cArr),'\n');
			i=signJudge(cArr);
			break;
		case 6:
			if (countNum>1)//每到下一题,就新建一个题对象
			{
				countNum3 = 0;
				readNext=readFrist;
				readFrist=new LD_File();
				readNext->setFL_NextP(readFrist);
				readFrist->setFL_PreviousP(readNext);
			}
			m=0;
			for (j=0;j<strlen(cArr);j++)
			{
				if (cArr[j]>='0'&&cArr[j]<='9')
				{
					m++;
					int nNUm=(int)(cArr[j]-'0');
					if (m==1)
					{
						sumTihao=nNUm;
					}else
					{
					sumTihao=sumTihao*(m-1)*10+nNUm;
					}
				}
			 }
			readFrist->setFL_TiHao(sumTihao);
			readFrist->setFL_TaoTi(sumTaoti);
			
			 countNum++;//统计题的个数
			readFileU.getline(cArr,sizeof(cArr),'\n');
			i=signJudge(cArr);
			break;
		default :
			break;
		}
		
	}
	_NoncePosition = readFrist;
	readFileU.close();

	return readHead;
}
/************************************************************************/
/* 由于文本存储的内容并非全部是用户所用的,所以用来判断该行的内容是否是标识符还是用户内容 
*/
/************************************************************************/
int LD_Control::signJudge(char _arr[])
{
	char arrB[4][15]={"[QAnswer]","[QScore]","[QContent]","[QItem]"};
	if (strcmp(_arr,arrB[0])==0)
	{
		return 1;
	}else if (strcmp(_arr,arrB[1])==0)
	{
		return 2;
	}else if (strcmp(_arr,arrB[2])==0)
	{
		return 3;
	}else if (strcmp(_arr,arrB[3])==0)
	{
		return 4;
	}else if (_arr[0]=='#')
	{
		return 5;
	}else if (_arr[0]=='*')
	{
		return 6;
	}
	return 0;
}
/************************************************************************/
/* 考生注册的写入                                                      */
/************************************************************************/
void LD_Control::LD_CTR_SaveRegister(LD_FileR *_pRHeadFileR)
{
	ofstream regWrite;
	regWrite.open(".\\data\\user.ini");
	if (regWrite==NULL)
	{
		cout<<"Open the file fail !"<<endl;
		exit(1);
	}
	LD_FileR *ppNewF=_pRHeadFileR;
	char signCH[34]="*********************************";
	while (ppNewF!=NULL)
	{
		//加入分隔符
		regWrite.write(signCH,strlen(signCH)).put('\n');
		//录入用户名
		char signName[]="[UserName]";
		regWrite.write(signName,strlen(signName));
		regWrite.write(ppNewF->getName().data(),strlen(ppNewF->getName().data())).put('\n');
		//录入密码
		char signPass[]="[UserPassword]";
		regWrite.write(signPass,strlen(signPass));
		regWrite.write(ppNewF->getPassWord().data(),(ppNewF->getPassWord()).length()).put('\n');
		ppNewF=ppNewF->getNext();
	}
	regWrite.write(signCH,strlen(signCH)).put('\n');
	regWrite.close();
}
/************************************************************************/
/* 考生注册读出                                                         */
/************************************************************************/
LD_FileR* LD_Control::LD_CTR_ReadRegister(void)
{
	ifstream regRead;
	regRead.open(".\\data\\user.ini");//user.ini
	if (regRead==NULL)
	{
		cout<<"Open the file fail !"<<endl;
		exit(1);
	}
	char arr1[100]="";
	char arr2[100]="";
	char *bb=arr2;
	LD_FileR *headFR;
	LD_FileR *pNext;
	LD_FileR *pFrist;
	headFR=new LD_FileR();
	pFrist=pNext=headFR;
	int i = 0;
	while(regRead.eof()==false)
	{
		regRead.getline(arr1,sizeof(arr1),'\n');
		i=signJudgeRE(arr1,&bb);
		if (i==2)
		{
			pFrist->setName(arr2);
		}else if (i==3)
		{
			pFrist->setPassWord(arr2);
			pFrist=new LD_FileR();
			pNext->setNext(pFrist);
			pNext=pFrist;
		}else if (i==1)
		{
			continue;
		}else if (i==0)
		{
			cout<<"错误字符"<<endl;
		}
		memset(arr1,0,sizeof(arr1));
		memset(arr2,0,sizeof(arr2));		
	}
	regRead.close();
	return headFR;
}
/************************************************************************/
/* 字符串拷贝函数                                                                     */
/************************************************************************/
char* LD_Control::memccpyMy(char *_cA,const char *_cB,char _cC,int _nD)
{
	char* pcReturn;
	int i=0;
	for (i=0;i<_nD;i++)
	{
		_cA[i]=_cB[i];
		if (_cB[i]==_cC)
		{
			pcReturn=&_cA[i+1];
		}
	}
	return pcReturn;
}
/************************************************************************/
/*     考生注册的标识符判断
		signJudgeRE返回 1为标识符
						2为姓名
						3为密码  
						0为错误                                      */
/************************************************************************/
int LD_Control::signJudgeRE(char _arr[],char **_arrA)
{
	char tempCH[50] = "";
	char *aa;
	char nameCH[] = "[UserName]";
	char passCH[] = "[UserPassword]";
	int i=0;
	if (_arr[0]=='*')
	{
		return 1;
	}else if (strcmp(strncpy(tempCH,_arr,strlen(nameCH)),nameCH)==0)
	{
		memset(tempCH,0,sizeof(tempCH));
		aa=memccpyMy(tempCH,_arr,']',strlen(_arr));
		for (i=0;i<strlen(aa);i++)
		{
			(*_arrA)[i]=aa[i];
		}
		//strcpy(_arrA,memccpyMy(tempCH,_arr,']',strlen(_arr)));
		return 2;
	}else if (strcmp(strncpy(tempCH,_arr,strlen(passCH)),passCH)==0)
	{
		memset(tempCH,0,sizeof(tempCH));		
		aa=memccpyMy(tempCH,_arr,']',strlen(_arr));
		for (i=0;i<strlen(aa);i++)
		{
			(*_arrA)[i]=aa[i];
		}
		//strcpy(_arrA,memccpyMy(tempCH,_arr,']',strlen(_arr)));
		return 3;
	}else if (_arr[0]=='\0')
	{
		return 1;
	}
	return 0;
}

⌨️ 快捷键说明

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