📄 ld_control.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 + -