<div>#include<stdio.h> //printf,puts,fopen,fwrite,fclose,getchar<br />#include<malloc.h> // malloc,free<br />#include<string.h> // strcpy,stsstr<br />#include<conio.h> // getch</div> <div>#define add1file "J:\주소록.txt"<br />typedef struct peoplelist<br />{<br />char name[8];<br />char tel[15];<br />char add1[100];<br />char MofW[5];<br />char blood[5];</div> <div>struct peoplelist *prev;<br />struct peoplelist *next;<br />}people;</div> <div>people *addhead = NULL;<br />people *find;</div> <div>int saved = 1; // 1을준이유는 등록 수정 삭제할 때 값이 0이되며, 종료할 때 값이0인 경우 파일에 주소데이터를 모두저장.</div> <div>void get_add1list(void); // 에러시 발생<br />int add_list(const people *add1);<br />int find_list(const char *name);<br />void headposition(void);<br />void tailposition(void);</div> <div>void add_add1(void); //등록<br />void find_add1(void); //검색<br />void modify_add1(void); //수정<br />void d*lete_add1(void); // 삭제<br />void print_add1(void); // 출력<br />void save_add1(void); //저장<br />void remove_add1(void);</div> <div>void main(void)<br />{<br />int ch;<br />get_add1list();<br /><br />puts(" **********주소록 프로그램**********");</div> <div>while(1) // 무한루프<br />{<br />printf("nn**********************************************n");<br />printf("* [1]등록 [S]저장 *n");<br />printf("* [2]검색 [Q]종료 *n");<br />printf("* [3]수정 *n");<br />printf("* [4]삭제 *n");<br />printf("* [5]출력 *n");<br />printf("**********************************************n");<br />ch = getch();<br /><br />switch(ch)<br />{<br />case '1' : add_add1(); break;<br />case '2' : find_add1(); break;<br />case '3' : modify_add1(); break;<br />case '4' : d*lete_add1(); break;<br />case '5' : print_add1(); break;<br />case 's' :<br />case 'S' : save_add1(); break;<br />case 'q' :<br />case 'Q' :<br />if(saved == 0)<br />{<br />printf("nn 변경된 주소 데이터를 저장하시겠습니까? (Y / N)");<br />ch = getchar();<br />if(ch =='Y' || ch == 'y')save_add1();<br />}</div> <div>remove_add1(); return;<br />default : printf("n1 ~ 5 또는 S(저장) Q(종료)를 누르십시오.n"); break;<br />}<br />}<br />}</div> <div>void get_add1list(void) //함수선언<br />{<br />people add1;<br />FILE *p1;</div> <div>p1 = fopen(add1file,"rb"); // ★★★★★★★★★★★★★★★"주소록", "w"<br /><br />if( p1 == NULL )<br />{<br />perror("파일 개방 에러");<br />return;<br />}</div> <div>while(!feof(p1))<br />{<br />fread(&add1,sizeof(people),1,p1);</div> <div>if(ferror(p1))<br />{<br />fclose(p1);<br />perror("파일 읽기 에러");<br />return;<br />}</div> <div>if(feof(p1)) break;</div> <div>if(add_list(&add1)==0)<br />{<br />printf("주소 데이터를 링크 리스트에 추가 할 수 없습니다.n");<br />}<br />}</div> <div>fclose(p1);<br />}</div> <div><br />int add_list(const people *add1)<br />{<br />people *plocal, *pv=addhead;</div> <div>headposition();</div> <div>//addhead가 초기화 되지않으면 한 번만 실행.<br />if(addhead==NULL)<br />{<br />plocal=malloc(sizeof(people)); // 구조체에게 할당<br />memset(plocal,0,sizeof(people));</div> <div>if(plocal == NULL)<br />{<br />return 0;<br />}</div> <div>addhead=plocal;<br />addhead->prev=NULL;<br />addhead->next=NULL;<br />}<br />else // addhead가 초기화가 되어도 계속실행<br />{<br />plocal = malloc(sizeof(people));<br />memset(plocal,0,sizeof(people));</div> <div>if(plocal == NULL) <br />{<br />return 0;<br />}</div> <div>while(pv->next)<br />{<br />pv=pv->next;<br />}</div> <div>pv->next=plocal;<br />plocal->prev = pv;<br />plocal->next=NULL;<br />}</div> <div>strcpy(plocal->name, add1->name);<br />strcpy(plocal->tel, add1->tel);<br />strcpy(plocal->add1,add1->add1);<br />strcpy(plocal->MofW,add1->MofW);<br />strcpy(plocal->blood,add1->blood);</div> <div>return 1;<br />}</div> <div>void headposition(void)<br />{<br />if(addhead==NULL)return;</div> <div>while(addhead->prev)<br />{<br />addhead = addhead->prev;<br />}<br />}</div> <div>void tailposition(void)<br />{<br />if(addhead == NULL) return;<br /><br />while(addhead->next)<br />{<br />addhead = addhead->next;<br />}<br />}</div> <div>int find_list(const char *name)<br />{<br />people *plocal;<br />headposition(); // 첫주소의 데이터를 가리킴</div> <div>plocal = addhead;</div> <div>while(plocal)<br />{<br />if(strstr(plocal->name,name))<br />{<br />find = plocal;<br />return 1;<br />}<br />plocal = plocal->next;<br />}<br />return 0;<br />}</div> <div>void add_add1(void)<br />{<br />people add1;</div> <div>memset(&add1,0,sizeof(people));</div> <div>printf("n이 름 :"); gets(add1.name);</div> <div>if(strlen(add1.name) == 0) return;</div> <div>printf("전화번호 :"); gets(add1.tel);<br />printf("주 소 :"); gets(add1.add1);<br />printf("성 별 :"); gets(add1.MofW);<br />printf("혈 액 형 :"); gets(add1.blood);</div> <div>if(find_list(add1.name) == 1)<br />{<br />printf("n이미 등록되어있습니다.nn");<br />puts(find->name);<br />puts(find->tel);<br />puts(find->add1);<br />puts(find->MofW);<br />puts(find->blood);<br />return;<br />}</div> <div>if(add_list(&add1))<br />{<br />saved = 0;<br />printf("n등록되었습니다.nn");<br />}<br />else<br />{<br />printf("n등록이 실패되었습니다.nn");<br />}<br />}</div> <div><br />void find_add1(void)<br />{<br />char buff[100] = {0,};<br />people *plocal;</div> <div>printf("nn검색할 이름/전화/주소/성별/혈액형의 일부를 입력하십시오.n");<br />printf("이름/전화/주소/성별/혈액형 :"); gets(buff);</div> <div>if(strlen(buff)==0) return;</div> <div>headposition();</div> <div>plocal = addhead;<br />find=NULL;</div> <div>while(plocal)<br />{<br />if(strstr(plocal->name,buff)) // 이름으로 검색<br />{<br />find = plocal;<br />break;<br />}<br />if(strstr(plocal->tel,buff)) // 전화를 검색<br />{<br />find=plocal;<br />break;<br />}<br />if(strstr(plocal->add1,buff)) // 주소로검색<br />{<br />find=plocal;<br />break;<br />}<br />if(strstr(plocal->MofW,buff)) //성별로 검색<br />{<br />find=plocal;<br />break;<br />}<br />if(strstr(plocal->blood,buff)) //혈액형으로 검색<br />{<br />find=plocal;<br />break;<br />}<br /><br />plocal = plocal->next;<br />}</div> <div>if(find)<br />{<br />puts(find->name);<br />puts(find->tel);<br />puts(find->add1);<br />puts(find->MofW);<br />puts(find->blood);<br />}<br />else<br />{<br />printf("nn%s를 주소록에서 찾을 수 없습니다.nn",buff);<br />}<br />}</div> <div>void modify_add1(void)<br />{<br />char name[100] = {0,};<br />people add1;</div> <div>while(1)<br />{<br />printf("nn수정할 이름 :"); gets(name);</div> <div>if(strlen(name) == 0) return;</div> <div>if(find_list(name) == 0)<br />{<br />puts("수정할 이름을 찾을 수 없습니다.");<br />continue;<br />}<br />break; <br />}<br /></div> <div><br />printf("n%s에 대한 주소 데이터는 아래와 같습니다.n",name);<br />puts(find->name);<br />puts(find->tel);<br />puts(find->add1);<br />puts(find->MofW);<br />puts(find->blood);</div> <div>printf("n수정하려는 이름/전화/주소/성별/혈액형을 입력 후 엔터키를 치세요.n");</div> <div>printf("이 름:") ;gets(add1.name);<br />printf("전 화:") ;gets(add1.tel);<br />printf("주 소:") ;gets(add1.add1);<br />printf("성 별:") ;gets(add1.MofW);<br />printf("혈 액 형:") ;gets(add1.blood);</div> <div>if(strlen(add1.name)==0) strcpy(add1.name,name);</div> <div>strcpy(find->name,add1.name);<br />strcpy(find->tel,add1.tel);<br />strcpy(find->add1,add1.add1);<br />strcpy(find->MofW,add1.MofW);<br />strcpy(find->blood,add1.blood);</div> <div>saved = 0;</div> <div>printf("%s에 대한 주소 데이터를 수정하였습니다.n",name);<br />}</div> <div>void d*lete_add1(void)<br />{<br />char name[100] ={0,};<br />people *plocal;<br />int ch;</div> <div>while(1)<br />{<br />printf("nn삭제할 이름:"); gets(name);</div> <div>if(strlen(name)==0) return;</div> <div>if(find_list(name)==0)<br />{<br />puts("삭제할 이름을 찾을 수 없습니다.");<br />continue;<br />}<br />break;<br />}<br /><br />puts(find->name);<br />puts(find->tel);<br />puts(find->add1);<br />puts(find->MofW);<br />puts(find->blood);</div> <div>printf("%s을 삭제하겠습니까?(Y/N)",name);<br />ch = getch();<br />fflush(stdin);</div> <div>if(ch=='Y' || ch=='y')<br />{<br />if(find->prev==NULL)<br />{<br />if(find->next==NULL)<br />{<br />free(find);<br />addhead=NULL;<br />}<br />else<br />{<br />plocal = find->next;<br />free(find);<br />plocal->prev=NULL;<br />addhead=plocal;<br />}<br />}<br />else if(find->next == NULL)<br />{<br />plocal = find->prev;<br />free(find);<br />plocal->next = NULL;<br />addhead = plocal;<br />}<br />else<br />{<br />plocal=find->prev;<br />plocal->next = find->next;</div> <div>plocal=find->next;<br />plocal->prev = find->prev;</div> <div>free(find);<br />addhead = plocal;<br />}</div> <div>saved = 0;</div> <div>printf("n검색된 주소 데이터를 삭제하였습니다.n");<br />}<br />}</div> <div>void print_add1(void)<br />{<br />int count =1;</div> <div>people *plocal;</div> <div>headposition();</div> <div>plocal = addhead;</div> <div>while(plocal->prev)<br />{<br />plocal = plocal->prev;<br />}</div> <div>printf("nn");</div> <div>while(plocal)<br />{<br />printf("번호 : %dn",count++);<br />puts(plocal->name);<br />puts(plocal->tel);<br />printf("%snn",plocal->add1);</div> <div>printf("아무키나 누르시오.(중지 : Q or q)n");<br />if(getch()=='q' || getch()=='Q') return;<br /><br />plocal = plocal->next;<br />}<br />}</div> <div>void save_add1(void)<br />{<br />people *plocal;<br />FILE *p1;</div> <div>if(addhead ==NULL) return;</div> <div>p1 = fopen(add1file,"w+b");</div> <div>if(p1==NULL)<br />{<br />perror("파일 개방 에러");<br />return;<br />}</div> <div>headposition();</div> <div>while(addhead)<br />{<br />plocal = addhead->next;</div> <div>fwrite(addhead,sizeof(people),1,p1);</div> <div>addhead = plocal;<br />}</div> <div>printf("n모든 데이터를 파일에 저장하였습니다.");</div> <div>saved = 1;</div> <div>fclose(p1);<br />}</div> <div>void remove_add1(void)<br />{<br />people *plocal;</div> <div>if(addhead == NULL) return;</div> <div>headposition();</div> <div>while(addhead)<br />{<br />plocal = addhead->next;</div> <div>free(addhead);</div> <div>addhead = plocal;<br />}</div> <div>addhead = NULL;<br />}<br />------------------------------</div> <div>구동은 잘되는데 파일 입출력이 문제입니다.</div> <div>txt파일이 저장되면 fwrite때문에 txt파일에 한줄로 저장이됩니다.</div> <div>fwrite 를 한번도 안써봐서 어떻게 해야 줄띄움이 생기는지 조금 풀어서</div> <div>알려주시면 꾸벆꾸벆 ㅜㅜ</div> <div> </div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.