📄 main.c
字号:
pCur = ( struct Node * )malloc( sizeof( struct Node ) );
fread(data.arr,sizeof(union Elemtype)*MAX_DATA_LEN,1,pFILE);
// printf("\n正在读取第%d个元素\n",i+1);
for(j=0;j<file->pTable->nLen;j++)
{
type=pTable->Head[j].cType;
switch (type)
{
case 'c':
pCur->arr[j].CHAR=data.arr[j].CHAR;
printf("%c\n", pCur->arr[j].CHAR);
break;
case 's':
// pCur->arr[j].STRINR=data.arr[j].STRINR;
// pCur->arr[j].STRINR[19]=0;
// puts( data.arr[j].STRINR);
strcpy(pCur->arr[j].STRINR,data.arr[j].STRINR);
puts( pCur->arr[j].STRINR);
break;
case 'd':
pCur->arr[j].DOUBLE=data.arr[j].DOUBLE;
printf("%.2lf\n", pCur->arr[j].DOUBLE);
break;
case 'i':
pCur->arr[j].INT=data.arr[j].INT;
printf("%d\n", pCur->arr[j].INT);
break;
default:
printf("无法识别的数据类型!\n");
}
}
// printf("已读取第%d个元素\n\n",i+1);
// file->nCount++;
pCur->next=file->pHead->next;
file->pHead->next=pCur;
}
file->nCount=file->pTable->nCount;
//file->nCount=i;
// printf("%d\n",file->nCount);
// printf("成功解读文件%s的数据区中的%d个数据\n",strFileName,file->nCount);
fclose(pFILE);
}
/*
* 函数功能:打开已有文件
* 输入参数:文件指针
* 输出参数:文件指针
* 返 回 值:无
*/
void Open(struct File *file)
{
struct File file2;
struct Node *pCur;
char strFileName[MAX_STRING_LENGTH];
int i;
printf("请输入文件名:\n");
gets(strFileName);
strcat(strFileName,".txt");
getchar();
Read(file,strFileName);
SubMenu(file);
// printf("文件打开成功!\n");
}
/*
* 函数功能:显示帮助文档
* 输入参数:无
* 输出参数:无
* 返 回 值:无
*/
void Help()
{
// printf("建设中......\n");
printf("新建文件按'N'\n打开文件按'O'\n帮助按'H'\n");
}
/*
* 函数功能:添加数据
* 输入参数:文件指针
* 输出参数:无
* 返 回 值:无
*/
void Add(struct File *file)
{
AddData(file);
}
/*
* 函数功能:检索出满足条件的int型数据
* 输入参数:文件指针,逻辑数组指针,字段序号
* 输出参数:逻辑数组指针
* 返 回 值:无
*/
void CheckInt( struct File *file , int *bIsOK, int nIndex )
{
int nLow, nMiddle ,nHigh;
int i,j,k;
int bFlag=OK;
int nCount=file->nCount;
char strChoice[20];
struct Node *pCur=file->pHead->next;
while( bFlag )
{
printf("准确查找('e')\n模糊查找('m')\n");
gets(strChoice);
getchar();
switch ( strChoice[0] )
{
case 'e':
printf("请输入匹配数据:\n");
scanf("%d",&nMiddle);
for( i=0 ; ( i < nCount ) && ( pCur ) ; i++, pCur = pCur->next )
{
if( ( (INITSTATUS==bIsOK[i]) && (nMiddle!=pCur->arr[nIndex].INT))
|| ( (OK==bIsOK[i]) &&(nMiddle!=pCur->arr[nIndex].INT) ) )
{
bIsOK[i]=ERROR;
}
else if( (INITSTATUS==bIsOK[i]) && (pCur->arr[nIndex].INT==nMiddle) )
{
bIsOK[i]=OK;
}
}
bFlag=ERROR;
break;
case 'm':
printf("请输入待查区间的下限和上限:\n");
scanf("%d %d",&nLow,&nHigh);
while(nLow>=nHigh)
{
printf("你输入的参数有误!\n");
printf("请输入待查区间的下限和上限:\n");
scanf("%d %d",&nLow,&nHigh);
}
for( i=0 ; ( i < nCount ) && ( pCur ) ; i++, pCur = pCur->next )
{
if( ( (INITSTATUS==bIsOK[i]) && ( (pCur->arr[nIndex].INT<nLow)||(pCur->arr[nIndex].INT>nHigh)))
|| ( (OK==bIsOK[i]) &&( (pCur->arr[nIndex].INT<nLow) || (pCur->arr[nIndex].INT>nHigh) ) ) )
{
bIsOK[i] = ERROR;
}
else if( (INITSTATUS==bIsOK[i]) && ( (pCur->arr[nIndex].INT>=nLow)&&(pCur->arr[nIndex].INT<=nHigh)) )
{
bIsOK[i] = OK;
}
}
bFlag=ERROR;
break;
default:
printf("无效键!请在输入:\n");
break;
}
}
}
/*
* 函数功能:检索出满足条件的double型数据
* 输入参数:文件指针,逻辑数组指针
* 输出参数:逻辑数组指针
* 返 回 值:无
*/
void CheckDouble( struct File *file , int *bIsOK, int nIndex )
{
double nLow, nMiddle ,nHigh;
int i,j,k;
int bFlag=OK;
int nCount=file->nCount;
char strChoice[20];
struct Node *pCur=file->pHead->next;
while( bFlag )
{
printf("准确查找('e')\n模糊查找('m')\n");
gets(strChoice);
getchar();
switch ( strChoice[0] )
{
case 'e':
printf("请输入匹配数据:\n");
scanf("%lf",&nMiddle);
for( i=0 ; ( i < nCount ) && ( pCur ) ; i++, pCur = pCur->next )
{
if( ( (INITSTATUS==bIsOK[i]) && (nMiddle!=pCur->arr[nIndex].DOUBLE))
|| ( (OK==bIsOK[i]) &&(nMiddle!=pCur->arr[nIndex].DOUBLE) ) )
{
bIsOK[i]=ERROR;
}
else if( (INITSTATUS==bIsOK[i]) && (pCur->arr[nIndex].DOUBLE==nMiddle) )
{
bIsOK[i]=OK;
}
}
bFlag=ERROR;
break;
case 'm':
printf("请输入待查区间的下限和上限:\n");
scanf("%lf %lf",&nLow,&nHigh);
while(nLow>=nHigh)
{
printf("你输入的参数有误!\n");
printf("请输入待查区间的下限和上限:\n");
scanf("%lf %lf",&nLow,&nHigh);
}
for( i=0 ; ( i < nCount ) && ( pCur ) ; i++, pCur = pCur->next )
{
if( ( (INITSTATUS==bIsOK[i]) && ( (pCur->arr[nIndex].DOUBLE<nLow)||(pCur->arr[nIndex].DOUBLE>nHigh)))
|| ( (OK==bIsOK[i]) &&( (pCur->arr[nIndex].DOUBLE<nLow) || (pCur->arr[nIndex].DOUBLE>nHigh) ) ) )
{
bIsOK[i] = ERROR;
}
else if( (INITSTATUS==bIsOK[i]) && ( (pCur->arr[nIndex].DOUBLE>=nLow)&&(pCur->arr[nIndex].DOUBLE<=nHigh)) )
{
bIsOK[i] = OK;
}
}
bFlag=ERROR;
break;
default:
printf("无效键!请在输入:\n");
break;
}
}
}
/*
* 函数功能:检索出满足条件的char型数据
* 输入参数:文件指针,逻辑数组指针
* 输出参数:逻辑数组指针
* 返 回 值:无
*/
void CheckChar( struct File *file , int *bIsOK , int nIndex )
{
char nMiddle;
int i,j,k;
int bFlag=OK;
int nCount=file->nCount;
char strChoice[20];
struct Node *pCur=file->pHead->next;
printf("请输入匹配数据:\n");
scanf("%c",&nMiddle);
for( i=0 ; ( i < nCount ) && ( pCur ) ; i++, pCur = pCur->next )
{
if( ( (INITSTATUS==bIsOK[i]) && (nMiddle!=pCur->arr[nIndex].CHAR))
|| ( (OK==bIsOK[i]) &&(nMiddle!=pCur->arr[nIndex].CHAR) ) )
{
bIsOK[i]=ERROR;
}
else if( (INITSTATUS==bIsOK[i]) && (pCur->arr[nIndex].CHAR==nMiddle) )
{
bIsOK[i]=OK;
}
}
}
/*
* 函数功能:检索出满足条件的string型数据
* 输入参数:文件指针,逻辑数组指针
* 输出参数:逻辑数组指针
* 返 回 值:无
*/
void CheckString( struct File *file , int *bIsOK , int nIndex )
{
char nMiddle[MAX_STRING_LENGTH];
int i,j,k;
int bFlag=OK;
int nCount=file->nCount;
char strChoice[20];
struct Node *pCur=file->pHead->next;
printf("请输入匹配数据:\n");
scanf("%s",&nMiddle);
getchar();
for( i=0 ; ( i < nCount ) && ( pCur ) ; i++, pCur = pCur->next )
{
if( ( (INITSTATUS==bIsOK[i]) && (strcmp(pCur->arr[nIndex].STRINR,nMiddle)))
|| ( (OK==bIsOK[i]) &&(strcmp(pCur->arr[nIndex].STRINR,nMiddle)) ) )
{
bIsOK[i]=ERROR;
}
else if( (INITSTATUS==bIsOK[i]) && (!strcmp(pCur->arr[nIndex].STRINR,nMiddle)) )
{
bIsOK[i]=OK;
}
}
}
/*
* 函数功能:删除记录
* 输入参数:数据区指针
* 输出参数:输出满足条件的数据项
* 返 回 值:无
*/
void MyDeletData(struct Node *pCur)
{
struct Node *pNext;
if( (!pCur) || (!pCur->next) )
{
printf("指针为空,删除失败!\n");
return ;
}
pNext=pCur->next;
pCur->next=pNext->next;
free(pNext);
}
/*
* 函数功能:组合条件查询显示
* 输入参数:文件指针
* 输出参数:输出满足条件的数据项
* 返 回 值:无
*/
void Find(struct File *file)
{
struct Table table = *( file->pTable );//获取文件表头
struct Node *pCur;
int i,j,k;
int nLen=file->pTable->nLen;// 获取字段总数
int nCount=file->nCount;// 获取数据区数据容量
int bFlag=OK;
int *bIsOK;// 记录各数据项是否满足要求:OK表示满足,ERROR表示不满足
char type;//字段类型
char strDataName[ MAX_LEN_FILE_NANE ];
char strChoice[20];
bIsOK=(int *)malloc( sizeof( int )*nCount );//分配空间
for( i=0; i < nCount;i++)
{
bIsOK[i]=INITSTATUS;//初始化各项为不满足
}
ShowTable(&table);//显示文件各字段信息
while( bFlag )
{
printf("请输入需满足条件的字段名:\n");
gets(strDataName);
// getchar();
if(!strlen(strDataName))
{
printf("你确定结束查询?(Y/any key)\n");
gets(strChoice);
if('Y'==strChoice[0])
{
bFlag=ERROR;
continue;
}
}
for( j=0 ; j < nLen ; j++ )
{
if( !strcmp( table.Head[j].strName, strDataName ))
{
break;
}
}
if( j >= nLen)
{
printf("无此字段名,请再输入\n");
continue;
}
type=table.Head[j].cType;
switch(type)
{
case 'c':
CheckChar(file,bIsOK,j);getchar();
break;
case 's':
CheckString(file,bIsOK,j);
break;
case 'i':
CheckInt(file,bIsOK,j);
break;
case 'd':
CheckDouble(file,bIsOK,j);
break;
default:
break;
}
}
for(k=0,i=0,pCur=file->pHead->next; pCur &&i<nCount;i++,pCur=pCur->next)
{
if(OK==bIsOK[i])
{
ShowData(pCur->arr,file);
k++;
}
}
if( !k)
{
printf("对不起,没有满足条件的数据\n");
}
}
void MyUpdateData(struct Node *pCur,struct File *file)
{
struct Table table = *( file->pTable );//获取文件表头
// struct Node *pCur;
int i,j,k;
int nLen=file->pTable->nLen;// 获取字段总数
int nCount=file->nCount;// 获取数据区数据容量
int bFlag=OK;
int *bIsOK;// 记录各数据项是否满足要求:OK表示满足,ERROR表示不满足
char type;//字段类型
char strDataName[ MAX_LEN_FILE_NANE ];
char strChoice[20];
bIsOK=(int *)malloc( sizeof( int )*nCount );//分配空间
for( i=0; i<nCount;i++)
{
bIsOK[i]=INITSTATUS;//初始化各项为不满足
}
ShowTable(&table);//显示文件各字段信息
while( bFlag )
{
printf("请输入需满足更新的字段名:\n");
gets(strDataName);
// getchar();
if(!strlen(strDataName))
{
printf("你确定结束更新?(Y/any key)\n");
gets(strChoice);
if('Y'==strChoice[0])
{
bFlag=ERROR;
continue;
}
}
for( j=0 ; j < nLen ; j++ )
{
if( !strcmp( table.Head[j].strName, strDataName ))
{
break;
}
}
if( j >= nLen)
{
printf("无此字段名,请在输入\n");
continue;
}
type=table.Head[j].cType;
printf("请输入更新内容:\n");
switch(type)
{
case 'c':
printf("请输入更新内容:\n");
scanf("%c",&(pCur->arr[j].CHAR));
break;
case 's':
scanf("%s",pCur->arr[j].STRINR);
break;
case 'i':
scanf("%d",&(pCur->arr[j].INT));
break;
case 'd':
scanf("%lf",&(pCur->arr[j].DOUBLE));
break;
default:
break;
}
}
/* for(i=0,pCur=file->pHead->next; pCur &&i<nCount;i++,pCur=pCur->next)
{
if(OK==bIsOK[i])
{
ShowData(pCur->arr,file);
}
}
*/
}
/*
* 函数功能:更新数据
* 输入参数:文件指针
* 输出参数:无
* 返 回 值:无
*/
void Update( struct File *file)
{
// printf("建设中......\n");
struct Table table = *( file->pTable );//获取文件表头
struct Node *pCur;
int i,j,k;
int nLen=file->pTable->nLen;// 获取字段总数
int nCount=file->nCount;// 获取数据区数据容量
int bFlag=OK;
int *bIsOK;// 记录各数据项是否满足要求:OK表示满足,ERROR表示不满足
char type;//字段类型
char strDataName[ MAX_LEN_FILE_NANE ];
char strChoice[20];
bIsOK=(int *)malloc( sizeof( int )*nCount );//分配空间
for( i=0; i<nCount;i++)
{
bIsOK[i]=INITSTATUS;//初始化各项为不满足
}
ShowTable(&table);//显示文件各字段信息
while( bFlag )
{
printf("请输入需满足条件的字段名:\n");
gets(strDataName);
// getchar();
if(!strlen(strDataName))
{
printf("你确定结束更新记录前筛选?(Y/any key)\n");
gets(strChoice);
if('Y'==strChoice[0])
{
bFlag=ERROR;
continue;
}
}
for( j=0 ; j < nLen ; j++ )
{
if( !strcmp( table.Head[j].strName, strDataName ))
{
break;
}
}
if( j >= nLen)
{
printf("无此字段名,请在输入\n");
continue;
}
type=table.Head[j].cType;
switch(type)
{
case 'c':
CheckChar(file,bIsOK,j);
break;
case 's':
CheckString(file,bIsOK,j);
break;
case 'i':
CheckInt(file,bIsOK,j);
break;
case 'd':
CheckDouble(file,bIsOK,j);
break;
default:
break;
}
}
for(i=0,k=0,pCur=file->pHead->next; pCur &&i<nCount;i++,pCur=pCur->next)
{
if(OK==bIsOK[i])
{
ShowData(pCur->arr,file);
MyUpdateData(pCur,file);
}
}
if(!k)
{
printf("没有满足要求的数据:\n");
return;
}
printf("数据更新成功\n");
}
/*
* 函数功能:删除数据
* 输入参数:文件指针
* 输出参数:无
* 返 回 值:无
*/
void Delete(struct File *file)
{
// printf("建设中......\n");
struct Table table = *( file->pTable );//获取文件表头
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -