Soft Ware/C 언어!!

자료 구조 리스트 , 저수준 파일 입출력 을 이용한 프로그램 !!!

달려가보자 2012. 2. 6. 14:35


아 드디어 만들었네요 ㅠㅠ
 
처음 C++로 만들었는데 구조체가 클래스 라는것 잃고 ㅠㅠ 만들다가

왜 소멸이 안돼 !!! 삽질을 하루종일 했네요 ㅠㅠ 그러다가 구조체가 클래스니깐 소멸자를 정의

하니깐 이젠 다시 C로 만들라고 하네요 ㅠㅠ 그래서 다시 만들어 봤습니다 ㅠㅠ

#define DBG 으로 정의된 부분은 주석 을 풀면

소스 사이사이에 출력문이 나옵니다 ^^ 그걸 보고 분석하면 될것 같네요 ^^


#include <stdio.h>
#include <sys/stat.h>
#include <io.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>


//#define DBG

#define stringLen     20


enum { ADD=1, DELETE , OUTPUT, EXIT };

typedef struct List
{
 char buffer[stringLen];
 struct List *next_node;
}List;
////////////////////////////////////////////////////////////////////////////////////////
/*
  프로그램을 다시 시작했을시 파일에 있는 내용을 리스트로 다시 생성 해주는 함수
*/
////////////////////////////////////////////////////////////////////////////////////////

int init_List(List ** HeadData, int * handle)
{
 int fp = 0;
 int i = 0;
 int size = 0;
 List * node = 0;

 (*handle) = _open("test",O_BINARY|_O_RDONLY|O_CREAT,S_IWRITE);

 lseek(*handle,0,SEEK_END);

 fp = tell(*handle);

 if(fp == 0) return 0;

 size = (fp/sizeof(List));

 node = (List *)calloc(size,sizeof(List));
 
    lseek(*handle,0,SEEK_SET);

 read(*handle,node,sizeof(List)*size);

 if(size == 1)
 {
  node->next_node = NULL;
 }
 else
 {
  for(i  = 0; i<size-1; i++)
  {
   node[i].next_node = &(node[i+1]);
  } 
  node[size-1].next_node = NULL;
 }
 (*HeadData)=node;
 
 close(*handle);

 return size;
}
////////////////////////////////////////////////////////////////////////////////////////
/*
  문자열을 입력할때마다 리스트로 붙여주는 역할
*/
////////////////////////////////////////////////////////////////////////////////////////
void MakefileList(List ** HeadData,const char * str_Data,int * size,int * handle)
{
 List * node = NULL;
 List * search_node = NULL;
 int count = 0;
 int fp = 0;

 node = (List *)calloc(1,sizeof(List));

 if(node == NULL)
 {
#ifdef DBG
  printf("heap allocate fail\n");
#endif
  exit(0);
 }

 strcpy(node->buffer,str_Data);
 node->next_node = NULL;
 

 if( (*HeadData) == NULL )
 {
#ifdef DBG
  printf("(*HeadData) succese\n");
#endif
  (*HeadData) = node;
 }
 else
 {
#ifdef DBG
  printf("(*HeadData) add succese\n");
#endif
  for(search_node = (*HeadData); search_node->next_node != NULL ; search_node = search_node->next_node);
#ifdef DBG
  printf("search_node->next_node : %s\n",search_node->buffer);
#endif
  search_node->next_node = node;
 }
 

  (*handle)  = _open("test",O_BINARY|_O_WRONLY|O_CREAT,S_IWRITE);
  
  if( (*handle) == -1)
  {
   printf("file open false\n");
   exit(0);
  }

  lseek(*handle,0,SEEK_END);
  write( (*handle),node,sizeof(List));
#ifdef DBG
   printf("Data write\n") ;
#endif 
   fp = tell(*handle);
#ifdef DBG
   printf("FP :  %d List size :  %d\n",fp, sizeof(List));
#endif 
  (*size)++;
 
 close((*handle));

}
////////////////////////////////////////////////////////////////////////////////////////
/*
  출력 함수
*/
////////////////////////////////////////////////////////////////////////////////////////
void PrintfileList(List ** HeadData,const int* size)
{
 int handle = 0;
 int count = 0;
 List * Data = NULL;

 if((*HeadData) == NULL)
 {
  printf("No Data\n");
  return ;
 }
#ifdef DBG
  printf("count : %d\n",*size);
#endif
 handle = _open("test",O_BINARY|_O_RDONLY);
 
 if(handle == -1)
 {
#ifdef DBG
  printf("file2 open false\n");
#endif
  exit(0);
 }

 
 Data = (List *)malloc(sizeof(List)*(*size));
 memset(Data,0,sizeof(List)*(*size));
 read(handle,Data,sizeof(List)*(*size));
 close(handle);

 for(count=0;count < (*size)-1; count++)
 {
  Data[count].next_node = &(Data[count+1]);
 }
 Data[((*size)-1)].next_node = NULL;

 for(count=0;count < (*size); count++) printf("%s\n",Data[count].buffer);
 
 free(Data);
}
////////////////////////////////////////////////////////////////////////////////////////
/*
  리스트에서 해당 문자열을 삭제해주는 함수
*/
////////////////////////////////////////////////////////////////////////////////////////
void delfile(List **Headfile,const char * string_Data, int * size)
{
 List * before = 0;
 List * node = 0;
 List * search = *Headfile;
 int count = 0;
 int handle = 0;
 int flag = 0;

 if(strcmp(search->buffer,string_Data) == 0)
 {
  node = (*Headfile);
  (*Headfile) =(*Headfile)->next_node;
  (*size)--;
  free(node);
  return ;
 }
#ifdef DBG
  cout<<"size :"<< *size <<endl;
#endif
 for(count = 0,search = (*Headfile); count < (*size); count ++)
 {
  
  if(strcmp(search->buffer,string_Data) == 0)
  {
   if(search->next_node == NULL )  before->next_node = NULL;
   
   else
   {
    before->next_node = search->next_node;
    search->next_node = NULL;
   }
   break;
  }
  before = search;
  search = search->next_node;
 }
 (*size)--;
 free(search);
}


////////////////////////////////////////////////////////////////////////////////////////
/*
  문자열이 리스트에 있는지를 판별 해주는 함수
*/
////////////////////////////////////////////////////////////////////////////////////////
int input_result(List ** HeadData , const char * buffer,int * size)
{
 List * node = (*HeadData) ;
 int count  = 0;
 for(count = 0; count < (*size) ; count ++,node = node->next_node)
 {
  if(strcmp(node->buffer,buffer) == 0)
  {
   printf("Data exist!!\n");
   return 1;
  }
 }
 return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
/*
  메인 함수
*/
////////////////////////////////////////////////////////////////////////////////////////
int main()
{
 
  int choice_Data = 0;
  int rehandle = 0;
  int handle = 0;
  List * Headfile = 0;
  List * node = 0;
  List * delData = 0;
  char buffer[stringLen] = {0,};
  int size = 0;
  int count = 0;

 
  size = init_List(&Headfile,&handle);
#ifdef DBG 
  printf("size : %d\n",size);
#endif
 restart:
   printf("1. file Add    2. file delete  3. file output   \n");
   printf( "choice :  " );
  scanf("%d",&choice_Data);
  
   switch(choice_Data)
   {
   case ADD:
       printf("Data input : ");
       memset(buffer,0,stringLen);
       scanf("%s",buffer);
 #ifdef DBG
   printf("Add Data input succese \n");
 #endif
     if(input_result(&Headfile,buffer,&size))  break;

     MakefileList(&Headfile,buffer,&size,&handle);
     break;
  
   case DELETE:
       printf("Delete Data input : ");
       memset(buffer,0,stringLen);
       scanf("%s",buffer);
       if(Headfile == NULL)
       {
       printf("No Data!!!\n");
        break;
       }
       if(!input_result(&Headfile,buffer,&size))  break;
       delfile(&Headfile,buffer,&size);
       free(delData);
       break;

   case OUTPUT:
 #ifdef DBG
   printf("print file\n");
 #endif
    PrintfileList(&Headfile,&size);
    break;
    
   }
   if(Headfile != NULL)
   {
    rehandle = _open("test",O_BINARY|_O_WRONLY|_O_TRUNC);
 
    node = Headfile;
    for(;node != NULL; node = node->next_node)
    {
     write(rehandle,node,sizeof(List));
     lseek(rehandle,0,SEEK_END);
    }
    close(rehandle);
   }
 
 goto restart;

}