아 드디어 만들었네요 ㅠㅠ
처음 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;
}
'Soft Ware > C 언어!!' 카테고리의 다른 글
점화식 (0) | 2012.03.13 |
---|---|
구조체 배열을 이용하여 파일에 쓰기 !!! (0) | 2012.01.31 |
저수준 파일 입출력 사용하기 !!! (0) | 2012.01.31 |
구조체 를 파일에 입력 및 출력 하기 (0) | 2012.01.31 |
ftell 함수 와 rewind 함수 (0) | 2012.01.30 |