2008년 07월 15일
[C언어] 데이터베이스DataBase 기본
이건 교수님께서 견본으로 짜주신거.
입력받고, 검색하는 기능밖에 없지만 여기에 살을 좀더 붙이면 DB로 활용가능.
지금이야 입력도 이름과 전화번호뿐이 받는게 없고
검색도 이름만으로 검색이고, 검색 후 출력시 이름만 나오게 되있지만
이 코드에 추가수정을 통해 더 다양한 자료를 입력받고
저장기능을 추가해서 입력된 정보들을 저장하고
필요한 자료를 검색을 통해 출력할 수 있게 해주면 그럴싸한 DB 완성.
교수님이 짜놓으신 견본: ExDatab.zip
위의 견본을 받아 압축을 풀어보면 알겠지만
이건 한 프로젝트 내에서 두개의 소스파일과 한개의 헤더파일로 나뉘어 있는것.
이건 그 나뉜것을 한개의 소스파일로 묶은 것 입니다. 합본: ExDB.c
합본의 소스코드를 아래에 요약글로 올립니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct fieldinfo
{
int size;
int fieldnum;
char *pData;
}FieldInfo;
typedef struct record
{
int size;
char *pData;
struct record *next;
struct record *prev;
}Record;
typedef struct findrecord
{
Record *pRecord;
struct findrecord *next;
struct findrecord *prev;
}FindRecord;
Record *AddRecord(Record *proot,char *pdata,int size)
{
Record *pRoot,*pNew;
pRoot=proot;
while(pRoot->next)
pRoot=pRoot->next;
pNew=(Record *)malloc(sizeof(Record));
pNew->size=size;
pNew->pData=(char *)malloc(size);
memcpy(pNew->pData,pdata,size);
pNew->next=0;
pNew->prev=pRoot;
pRoot->next=pNew;
return pNew;
}
char *FindFieldData(Record *precord,int fnum)
{
int i;
char *pData;
pData=precord->pData;
for(i=0;i<fnum;i++)
{
int len;
memcpy(&len,pData,sizeof(int));
pData+=sizeof(int);
pData+=len;
}
return pData;
}
Record *FindRecordData(Record *proot,char *pseek,int fnum,int mode)
{
Record *pRecord;
pRecord=proot;
while(pRecord)
{
char *pData;
if(!pRecord->pData)
{
pRecord=pRecord->next;
continue;
}
pData=FindFieldData(pRecord,fnum);
pData+=sizeof(int);
if(mode==0)
{
if(strcmp(pData,pseek)==0)
return pRecord;
}
else
{
if(strstr(pData,pseek))
return pRecord;
}
pRecord=pRecord->next;
}
return 0;
}
FindRecord *FindRecordSet(Record *precord,char *seek,int fnum,int mode)
{
FindRecord *pFindRecord,*pNew,*pFindRoot;
Record *pRecord;
pFindRecord=0;
pFindRoot=0;
pRecord=precord;
while(pRecord)
{
pRecord=FindRecordData(pRecord,seek,fnum,mode);
if(!pRecord)
break;
if(!pFindRecord)
{
pFindRecord=(FindRecord *)malloc(sizeof(FindRecord));
pFindRecord->pRecord=pRecord;
pFindRecord->next=0;
pFindRecord->prev=0;
pFindRoot=pFindRecord;
}
else
{
pNew=(FindRecord *)malloc(sizeof(FindRecord));
pNew->pRecord=pRecord;
pNew->next=0;
pNew->prev=pFindRecord;
pFindRecord->next=pNew;
pFindRecord=pNew;
}
pRecord=pRecord->next;
}
return pFindRoot;
}
void FreeRecordSet(FindRecord *pfindrecord)
{
FindRecord *pFind;
pFind=pfindrecord;
while(pFind)
{
FindRecord *pDel;
pDel=pFind;
pFind=pFind->next;
free(pDel);
}
}
Record *pRoot,*pCurrent;
void init()
{
pRoot=(Record *)malloc(sizeof(Record));
pRoot->pData=0;
pRoot->next=0;
pRoot->prev=0;
pCurrent=0;
}
void adddata()
{
char temp[512],name[512],tel[512],*data,*pPos;
int lname,ltel,size;
memset(name,0,512);
memset(tel,0,512);
printf("name:");
gets(temp);
lname=strlen(temp)+1;
strcpy(name,temp);
printf("tel:");
gets(temp);
ltel=strlen(temp)+1;
strcpy(tel,temp);
size=(sizeof(int)*2)+lname+ltel;
data=(char *)malloc(size);
memset(data,0,size);
pPos=data;
memcpy(pPos,&lname,4);
pPos+=4;
memcpy(pPos,name,lname);
pPos+=lname;
memcpy(pPos,<el,4);
pPos+=4;
memcpy(pPos,tel,ltel);
pCurrent=AddRecord(pRoot,data,size);
free(data);
}
void finddata()
{
char temp[80];
FindRecord *pFindRecord,*pFind;
printf("name");
gets(temp);
pFindRecord=FindRecordSet(pRoot,temp,0,1);
if(!pFindRecord)
{
printf("not found!");
return;
}
pFind=pFindRecord;
while(pFind)
{
printf("%s\n",pFind->pRecord->pData+4);
pFind=pFind->next;
}
FreeRecordSet(pFindRecord);
}
void main()
{
char temp[80];
int mode;
init();
while(1)
{
printf("[1]입력 [2]검색 [0]종료\n");
gets(temp);
sscanf(temp,"%d",&mode);
if(mode==0)
break;
switch(mode)
{
case 1:
adddata();
break;
case 2:
finddata();
break;
}
}
}
#include <stdlib.h>
#include <string.h>
typedef struct fieldinfo
{
int size;
int fieldnum;
char *pData;
}FieldInfo;
typedef struct record
{
int size;
char *pData;
struct record *next;
struct record *prev;
}Record;
typedef struct findrecord
{
Record *pRecord;
struct findrecord *next;
struct findrecord *prev;
}FindRecord;
Record *AddRecord(Record *proot,char *pdata,int size)
{
Record *pRoot,*pNew;
pRoot=proot;
while(pRoot->next)
pRoot=pRoot->next;
pNew=(Record *)malloc(sizeof(Record));
pNew->size=size;
pNew->pData=(char *)malloc(size);
memcpy(pNew->pData,pdata,size);
pNew->next=0;
pNew->prev=pRoot;
pRoot->next=pNew;
return pNew;
}
char *FindFieldData(Record *precord,int fnum)
{
int i;
char *pData;
pData=precord->pData;
for(i=0;i<fnum;i++)
{
int len;
memcpy(&len,pData,sizeof(int));
pData+=sizeof(int);
pData+=len;
}
return pData;
}
Record *FindRecordData(Record *proot,char *pseek,int fnum,int mode)
{
Record *pRecord;
pRecord=proot;
while(pRecord)
{
char *pData;
if(!pRecord->pData)
{
pRecord=pRecord->next;
continue;
}
pData=FindFieldData(pRecord,fnum);
pData+=sizeof(int);
if(mode==0)
{
if(strcmp(pData,pseek)==0)
return pRecord;
}
else
{
if(strstr(pData,pseek))
return pRecord;
}
pRecord=pRecord->next;
}
return 0;
}
FindRecord *FindRecordSet(Record *precord,char *seek,int fnum,int mode)
{
FindRecord *pFindRecord,*pNew,*pFindRoot;
Record *pRecord;
pFindRecord=0;
pFindRoot=0;
pRecord=precord;
while(pRecord)
{
pRecord=FindRecordData(pRecord,seek,fnum,mode);
if(!pRecord)
break;
if(!pFindRecord)
{
pFindRecord=(FindRecord *)malloc(sizeof(FindRecord));
pFindRecord->pRecord=pRecord;
pFindRecord->next=0;
pFindRecord->prev=0;
pFindRoot=pFindRecord;
}
else
{
pNew=(FindRecord *)malloc(sizeof(FindRecord));
pNew->pRecord=pRecord;
pNew->next=0;
pNew->prev=pFindRecord;
pFindRecord->next=pNew;
pFindRecord=pNew;
}
pRecord=pRecord->next;
}
return pFindRoot;
}
void FreeRecordSet(FindRecord *pfindrecord)
{
FindRecord *pFind;
pFind=pfindrecord;
while(pFind)
{
FindRecord *pDel;
pDel=pFind;
pFind=pFind->next;
free(pDel);
}
}
Record *pRoot,*pCurrent;
void init()
{
pRoot=(Record *)malloc(sizeof(Record));
pRoot->pData=0;
pRoot->next=0;
pRoot->prev=0;
pCurrent=0;
}
void adddata()
{
char temp[512],name[512],tel[512],*data,*pPos;
int lname,ltel,size;
memset(name,0,512);
memset(tel,0,512);
printf("name:");
gets(temp);
lname=strlen(temp)+1;
strcpy(name,temp);
printf("tel:");
gets(temp);
ltel=strlen(temp)+1;
strcpy(tel,temp);
size=(sizeof(int)*2)+lname+ltel;
data=(char *)malloc(size);
memset(data,0,size);
pPos=data;
memcpy(pPos,&lname,4);
pPos+=4;
memcpy(pPos,name,lname);
pPos+=lname;
memcpy(pPos,<el,4);
pPos+=4;
memcpy(pPos,tel,ltel);
pCurrent=AddRecord(pRoot,data,size);
free(data);
}
void finddata()
{
char temp[80];
FindRecord *pFindRecord,*pFind;
printf("name");
gets(temp);
pFindRecord=FindRecordSet(pRoot,temp,0,1);
if(!pFindRecord)
{
printf("not found!");
return;
}
pFind=pFindRecord;
while(pFind)
{
printf("%s\n",pFind->pRecord->pData+4);
pFind=pFind->next;
}
FreeRecordSet(pFindRecord);
}
void main()
{
char temp[80];
int mode;
init();
while(1)
{
printf("[1]입력 [2]검색 [0]종료\n");
gets(temp);
sscanf(temp,"%d",&mode);
if(mode==0)
break;
switch(mode)
{
case 1:
adddata();
break;
case 2:
finddata();
break;
}
}
}
[닫기]
# by | 2008/07/15 19:20 | Source Code/File | 트랙백 | 덧글(0)




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]