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

📄 main.c

📁 纯C语言写的小型通用数据库
💻 C
📖 第 1 页 / 共 3 页
字号:

                    
				    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 + -