게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C언어 인데 마지막으로 한번올려봅니다.
게시물ID : computer_132479짧은주소 복사하기
작성자 : 익명임네다
추천 : 0
조회수 : 287회
댓글수 : 2개
등록시간 : 2013/12/04 18:27:28
#include<stdio.h> //printf,puts,fopen,fwrite,fclose,getchar
#include<malloc.h> // malloc,free
#include<string.h> // strcpy,stsstr
#include<conio.h> // getch
#define add1file "J:\주소록.txt"
typedef struct peoplelist
{
char name[8];
char tel[15];
char add1[100];
char MofW[5];
char blood[5];
struct peoplelist *prev;
struct peoplelist *next;
}people;
people *addhead = NULL;
people *find;
int saved = 1; // 1을준이유는 등록 수정 삭제할 때 값이 0이되며, 종료할 때 값이0인 경우 파일에 주소데이터를 모두저장.
void get_add1list(void); // 에러시 발생
int add_list(const people *add1);
int find_list(const char *name);
void headposition(void);
void tailposition(void);
void add_add1(void); //등록
void find_add1(void); //검색
void modify_add1(void); //수정
void d*lete_add1(void); // 삭제
void print_add1(void); // 출력
void save_add1(void); //저장
void remove_add1(void);
void main(void)
{
int ch;
get_add1list();

puts(" **********주소록 프로그램**********");
while(1) // 무한루프
{
printf("nn**********************************************n");
printf("* [1]등록 [S]저장 *n");
printf("* [2]검색 [Q]종료 *n");
printf("* [3]수정 *n");
printf("* [4]삭제 *n");
printf("* [5]출력 *n");
printf("**********************************************n");
ch = getch();

switch(ch)
{
case '1' : add_add1(); break;
case '2' : find_add1(); break;
case '3' : modify_add1(); break;
case '4' : d*lete_add1(); break;
case '5' : print_add1(); break;
case 's' :
case 'S' : save_add1(); break;
case 'q' :
case 'Q' :
if(saved == 0)
{
printf("nn 변경된 주소 데이터를 저장하시겠습니까? (Y / N)");
ch = getchar();
if(ch =='Y' || ch == 'y')save_add1();
}
remove_add1(); return;
default : printf("n1 ~ 5 또는 S(저장) Q(종료)를 누르십시오.n"); break;
}
}
}
void get_add1list(void) //함수선언
{
people add1;
FILE *p1;
p1 = fopen(add1file,"rb"); // ★★★★★★★★★★★★★★★"주소록", "w"

if( p1 == NULL )
{
perror("파일 개방 에러");
return;
}
while(!feof(p1))
{
fread(&add1,sizeof(people),1,p1);
if(ferror(p1))
{
fclose(p1);
perror("파일 읽기 에러");
return;
}
if(feof(p1)) break;
if(add_list(&add1)==0)
{
printf("주소 데이터를 링크 리스트에 추가 할 수 없습니다.n");
}
}
fclose(p1);
}

int add_list(const people *add1)
{
people *plocal, *pv=addhead;
headposition();
//addhead가 초기화 되지않으면 한 번만 실행.
if(addhead==NULL)
{
plocal=malloc(sizeof(people)); // 구조체에게 할당
memset(plocal,0,sizeof(people));
if(plocal == NULL)
{
return 0;
}
addhead=plocal;
addhead->prev=NULL;
addhead->next=NULL;
}
else // addhead가 초기화가 되어도 계속실행
{
plocal = malloc(sizeof(people));
memset(plocal,0,sizeof(people));
if(plocal == NULL)
{
return 0;
}
while(pv->next)
{
pv=pv->next;
}
pv->next=plocal;
plocal->prev = pv;
plocal->next=NULL;
}
strcpy(plocal->name, add1->name);
strcpy(plocal->tel, add1->tel);
strcpy(plocal->add1,add1->add1);
strcpy(plocal->MofW,add1->MofW);
strcpy(plocal->blood,add1->blood);
return 1;
}
void headposition(void)
{
if(addhead==NULL)return;
while(addhead->prev)
{
addhead = addhead->prev;
}
}
void tailposition(void)
{
if(addhead == NULL) return;

while(addhead->next)
{
addhead = addhead->next;
}
}
int find_list(const char *name)
{
people *plocal;
headposition(); // 첫주소의 데이터를 가리킴
plocal = addhead;
while(plocal)
{
if(strstr(plocal->name,name))
{
find = plocal;
return 1;
}
plocal = plocal->next;
}
return 0;
}
void add_add1(void)
{
people add1;
memset(&add1,0,sizeof(people));
printf("n이 름 :"); gets(add1.name);
if(strlen(add1.name) == 0) return;
printf("전화번호 :"); gets(add1.tel);
printf("주 소 :"); gets(add1.add1);
printf("성 별 :"); gets(add1.MofW);
printf("혈 액 형 :"); gets(add1.blood);
if(find_list(add1.name) == 1)
{
printf("n이미 등록되어있습니다.nn");
puts(find->name);
puts(find->tel);
puts(find->add1);
puts(find->MofW);
puts(find->blood);
return;
}
if(add_list(&add1))
{
saved = 0;
printf("n등록되었습니다.nn");
}
else
{
printf("n등록이 실패되었습니다.nn");
}
}

void find_add1(void)
{
char buff[100] = {0,};
people *plocal;
printf("nn검색할 이름/전화/주소/성별/혈액형의 일부를 입력하십시오.n");
printf("이름/전화/주소/성별/혈액형 :"); gets(buff);
if(strlen(buff)==0) return;
headposition();
plocal = addhead;
find=NULL;
while(plocal)
{
if(strstr(plocal->name,buff)) // 이름으로 검색
{
find = plocal;
break;
}
if(strstr(plocal->tel,buff)) // 전화를 검색
{
find=plocal;
break;
}
if(strstr(plocal->add1,buff)) // 주소로검색
{
find=plocal;
break;
}
if(strstr(plocal->MofW,buff)) //성별로 검색
{
find=plocal;
break;
}
if(strstr(plocal->blood,buff)) //혈액형으로 검색
{
find=plocal;
break;
}

plocal = plocal->next;
}
if(find)
{
puts(find->name);
puts(find->tel);
puts(find->add1);
puts(find->MofW);
puts(find->blood);
}
else
{
printf("nn%s를 주소록에서 찾을 수 없습니다.nn",buff);
}
}
void modify_add1(void)
{
char name[100] = {0,};
people add1;
while(1)
{
printf("nn수정할 이름 :"); gets(name);
if(strlen(name) == 0) return;
if(find_list(name) == 0)
{
puts("수정할 이름을 찾을 수 없습니다.");
continue;
}
break;
}

printf("n%s에 대한 주소 데이터는 아래와 같습니다.n",name);
puts(find->name);
puts(find->tel);
puts(find->add1);
puts(find->MofW);
puts(find->blood);
printf("n수정하려는 이름/전화/주소/성별/혈액형을 입력 후 엔터키를 치세요.n");
printf("이 름:") ;gets(add1.name);
printf("전 화:") ;gets(add1.tel);
printf("주 소:") ;gets(add1.add1);
printf("성 별:") ;gets(add1.MofW);
printf("혈 액 형:") ;gets(add1.blood);
if(strlen(add1.name)==0) strcpy(add1.name,name);
strcpy(find->name,add1.name);
strcpy(find->tel,add1.tel);
strcpy(find->add1,add1.add1);
strcpy(find->MofW,add1.MofW);
strcpy(find->blood,add1.blood);
saved = 0;
printf("%s에 대한 주소 데이터를 수정하였습니다.n",name);
}
void d*lete_add1(void)
{
char name[100] ={0,};
people *plocal;
int ch;
while(1)
{
printf("nn삭제할 이름:"); gets(name);
if(strlen(name)==0) return;
if(find_list(name)==0)
{
puts("삭제할 이름을 찾을 수 없습니다.");
continue;
}
break;
}

puts(find->name);
puts(find->tel);
puts(find->add1);
puts(find->MofW);
puts(find->blood);
printf("%s을 삭제하겠습니까?(Y/N)",name);
ch = getch();
fflush(stdin);
if(ch=='Y' || ch=='y')
{
if(find->prev==NULL)
{
if(find->next==NULL)
{
free(find);
addhead=NULL;
}
else
{
plocal = find->next;
free(find);
plocal->prev=NULL;
addhead=plocal;
}
}
else if(find->next == NULL)
{
plocal = find->prev;
free(find);
plocal->next = NULL;
addhead = plocal;
}
else
{
plocal=find->prev;
plocal->next = find->next;
plocal=find->next;
plocal->prev = find->prev;
free(find);
addhead = plocal;
}
saved = 0;
printf("n검색된 주소 데이터를 삭제하였습니다.n");
}
}
void print_add1(void)
{
int count =1;
people *plocal;
headposition();
plocal = addhead;
while(plocal->prev)
{
plocal = plocal->prev;
}
printf("nn");
while(plocal)
{
printf("번호 : %dn",count++);
puts(plocal->name);
puts(plocal->tel);
printf("%snn",plocal->add1);
printf("아무키나 누르시오.(중지 : Q or q)n");
if(getch()=='q' || getch()=='Q') return;

plocal = plocal->next;
}
}
void save_add1(void)
{
people *plocal;
FILE *p1;
if(addhead ==NULL) return;
p1 = fopen(add1file,"w+b");
if(p1==NULL)
{
perror("파일 개방 에러");
return;
}
headposition();
while(addhead)
{
plocal = addhead->next;
fwrite(addhead,sizeof(people),1,p1);
addhead = plocal;
}
printf("n모든 데이터를 파일에 저장하였습니다.");
saved = 1;
fclose(p1);
}
void remove_add1(void)
{
people *plocal;
if(addhead == NULL) return;
headposition();
while(addhead)
{
plocal = addhead->next;
free(addhead);
addhead = plocal;
}
addhead = NULL;
}
------------------------------
구동은 잘되는데 파일 입출력이 문제입니다.
txt파일이 저장되면 fwrite때문에 txt파일에 한줄로 저장이됩니다.
fwrite 를 한번도 안써봐서 어떻게 해야 줄띄움이 생기는지 조금 풀어서
알려주시면 꾸벆꾸벆 ㅜㅜ
 
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호