[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,&ltel,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 Kyle | 2008/07/15 19:20 | Source Code/File | 트랙백 | 덧글(0)

트랙백 주소 : http://demilune.egloos.com/tb/588408
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶