728x90
#include"kyshdr.h" // stdio.h + stdlib.h +string.h
#include
#define RCSZ 80
#define OPEN(fp,fl,m) { if ((fp=fopen(fl,m))==NULL) { printf("Open %s 실패\n",fl); exit(5); } } /* 위의 마크로함수에서 '\'는 다음행으로 연결됨을 뜻함 */
typedef struct card_st CARD; //구조체 자료형을 선언
struct card_st {
char name[16]; //성 명
char phon[16]; //전 화
CARD *next; // struct card_st *next;
};
/* 함수원형 */
static int get_jno(); // 작업 번호
static int add_card(); // 신규/추가
static int inq_card(); // 조회
static int lst_card(); // 리스트
static int get_card(); // 파일 읽기
static int put_card(); // 파일 등록
CARD *ins_node(CARD *); // node 삽입
void del_node(CARD *); // node 삭제
void scrdis(char *); // 텍스트화일을 화면에 띄움
void error(char *); // error msg 출력
CARD list, *head, *curr;
char *fname="NAMECARD.DAT", buf[RCSZ]; // 파일명, 자료입력 버퍼
void main() {
int n;
curr = head = &list;
curr->next = head->next = head; // empty circular list
while(1) {
n = get_jno();
if (n == 0) break;
switch(n) {
case 1: // 신규/추가
add_card();
break;
case 2: // 조회
inq_card();
break;
case 3: // 리스트
lst_card();
break;
case 4: // 파일에 저장
put_card();
break;
}
}
printf("\n\n작업종료\007\007\007");
}
CARD *ins_node(CARD *curr) {
CARD *tmp;
if ((tmp = (CARD *)malloc(sizeof(CARD))) != NULL) {
tmp->next = curr->next;
curr->next = tmp;
}
return tmp;
}
static int add_card(void) {
char *scr="..\\scr\\CARD01.SCR";
CARD *tmp;
int rc=0, x=12, y=3;
scrdis(scr);
while(1) {
if ((tmp = ins_node(curr)) == NULL) {
printf("Out of memory.\n");
exit(1);
}
curr = tmp;
gotoxy(x,y); clreol();
gets(buf);
if (*buf == '\0') break;
strcpy(curr->name, buf);
gotoxy(x,y+2); clreol();
gets(buf);
strcpy(curr->phon, buf);
printf("\n%p %p", head, curr);
}
return rc;
}
static int inq_card(void) {
int rc=0, hits=0;
char *scr="..\\scr\\CARD02.SCR";
CARD *tmp;
scrdis(scr);
while(1) {
tmp = head;
if (tmp->next == head) {
puts("空 리스트입니다");
getch();
return ++rc;
}
gotoxy(1,3); printf("\n성 명: "); clreol();
gets(buf);
if (*buf == '\0') break;
hits = 0;
while(tmp->next != head) {
tmp = tmp->next;
if (strcmp(tmp->name,buf) == 0) {
gotoxy(1,3);
printf("%-16s %-16s\n",tmp->name,tmp->phon);
hits++;
}
}
if (hits == 0) {
gotoxy(18,3); printf("리스트에 없읍니다.");
getch();
}
}
return rc;
}
static int lst_card() {
char *scr="..\\scr\\CARD02.SCR";
int rc=0;
CARD *tmp;
scrdis(scr);
tmp = head;
if (tmp->next == head) {
puts("空 리스트입니다");
getch();
return ++rc;
}
else
while(tmp->next != head) {
if (*tmp->name != '\0') {
printf("\n%-16s %-16s", tmp->name,tmp->phon);
}
tmp = tmp->next;
}
getch();
return rc;
}
static int put_card() {
FILE *fp;
CARD *tmp;
int rc=0;
OPEN(fp,fname,"w");
tmp = head;
if (tmp->next == head) {
puts("空 리스트입니다");
getch();
return ++rc;
}
else
while(tmp->next != head) {
if (*tmp->name != '\0') {
printf("\n%p %p",tmp, tmp->next);
printf("\n%-16s\t%-16s", tmp->name,tmp->phon);
fprintf(fp, "%-16s\t%-16s\n", tmp->name,tmp->phon);
}
tmp = tmp->next;
}
fclose(fp);
if (ferror(fp))
error("Can\'t close data_file");
getch();
return rc;
}
static int get_card() {
FILE *fp;
char *cp;
int rc=0;
CARD *tmp;
OPEN(fp,fname,"r");
while(fgets(buf, RCSZ, fp) != NULL) {
cp=buf;
while(*cp != '\n') ++cp; // '\n' -> '\0'
*cp='\0';
if ((tmp = ins_node(curr)) == NULL)
error("Out of memory");
curr = tmp;
strcpy(curr->name, strtok(buf, "\t"));
strcpy(curr->phon, strtok(NULL,"\t"));
}
fclose(fp);
if (ferror(fp))
error("Can\'t close data_file");
return rc;
}
void del_node(CARD *curr) {
CARD *tmp;
tmp = curr->next;
curr->next = curr->next->next;
free(tmp);
}
int get_jno(void) {
char *scr="..\\scr\\CARD00.SCR";
int n;
scrdis(scr);
gotoxy(45, 9); clreol();
do {
n = getche() - '0';
} while (n < 0 || n > 4);
return n;
}
void scrdis(char *ifle) { //Text 파일을 화면에 띄움
int ch,lin=0,y=0;
char buf[RCSZ],*cp=buf;
FILE *ifp;
clrscr(); y=0;
OPEN(ifp,ifle,"r");
while ((ch = getc(ifp)) != EOF) {
*cp++ = ch;
if (ch != '\n') continue;
lin++;
*(cp-1) = '\0';
if (lin < 24) {
gotoxy(1,++y); printf("%-80s",buf);
cp = buf;
continue;
}
}
fclose(ifp);
}
void error(char *str) {
printf("Error: %s(%s).\n",str,fname);
getch();
exit(-1);
}
/* edit로 만든 텍스트 화면
..\scr\CARD00.SCR
<명함관리 주메뉴>
0. 작업 종료
1. 신규 명함 입력
2. 등록 명함 조회
3. 명함 목록 list
4. 명함 파일 저장
5. 기존 명함 삭제
작업번호 선택: _
..\scr\CARD01.SCR
명함 입력 (성명란에 냉무 & Enter: 입력종료)
1. 성 명:
2. 전 화:
..\scr\CARD02.SCR
성 명 전 화 번 호
................ ................
*/
#include
#define RCSZ 80
#define OPEN(fp,fl,m) { if ((fp=fopen(fl,m))==NULL) { printf("Open %s 실패\n",fl); exit(5); } } /* 위의 마크로함수에서 '\'는 다음행으로 연결됨을 뜻함 */
typedef struct card_st CARD; //구조체 자료형을 선언
struct card_st {
char name[16]; //성 명
char phon[16]; //전 화
CARD *next; // struct card_st *next;
};
/* 함수원형 */
static int get_jno(); // 작업 번호
static int add_card(); // 신규/추가
static int inq_card(); // 조회
static int lst_card(); // 리스트
static int get_card(); // 파일 읽기
static int put_card(); // 파일 등록
CARD *ins_node(CARD *); // node 삽입
void del_node(CARD *); // node 삭제
void scrdis(char *); // 텍스트화일을 화면에 띄움
void error(char *); // error msg 출력
CARD list, *head, *curr;
char *fname="NAMECARD.DAT", buf[RCSZ]; // 파일명, 자료입력 버퍼
void main() {
int n;
curr = head = &list;
curr->next = head->next = head; // empty circular list
while(1) {
n = get_jno();
if (n == 0) break;
switch(n) {
case 1: // 신규/추가
add_card();
break;
case 2: // 조회
inq_card();
break;
case 3: // 리스트
lst_card();
break;
case 4: // 파일에 저장
put_card();
break;
}
}
printf("\n\n작업종료\007\007\007");
}
CARD *ins_node(CARD *curr) {
CARD *tmp;
if ((tmp = (CARD *)malloc(sizeof(CARD))) != NULL) {
tmp->next = curr->next;
curr->next = tmp;
}
return tmp;
}
static int add_card(void) {
char *scr="..\\scr\\CARD01.SCR";
CARD *tmp;
int rc=0, x=12, y=3;
scrdis(scr);
while(1) {
if ((tmp = ins_node(curr)) == NULL) {
printf("Out of memory.\n");
exit(1);
}
curr = tmp;
gotoxy(x,y); clreol();
gets(buf);
if (*buf == '\0') break;
strcpy(curr->name, buf);
gotoxy(x,y+2); clreol();
gets(buf);
strcpy(curr->phon, buf);
printf("\n%p %p", head, curr);
}
return rc;
}
static int inq_card(void) {
int rc=0, hits=0;
char *scr="..\\scr\\CARD02.SCR";
CARD *tmp;
scrdis(scr);
while(1) {
tmp = head;
if (tmp->next == head) {
puts("空 리스트입니다");
getch();
return ++rc;
}
gotoxy(1,3); printf("\n성 명: "); clreol();
gets(buf);
if (*buf == '\0') break;
hits = 0;
while(tmp->next != head) {
tmp = tmp->next;
if (strcmp(tmp->name,buf) == 0) {
gotoxy(1,3);
printf("%-16s %-16s\n",tmp->name,tmp->phon);
hits++;
}
}
if (hits == 0) {
gotoxy(18,3); printf("리스트에 없읍니다.");
getch();
}
}
return rc;
}
static int lst_card() {
char *scr="..\\scr\\CARD02.SCR";
int rc=0;
CARD *tmp;
scrdis(scr);
tmp = head;
if (tmp->next == head) {
puts("空 리스트입니다");
getch();
return ++rc;
}
else
while(tmp->next != head) {
if (*tmp->name != '\0') {
printf("\n%-16s %-16s", tmp->name,tmp->phon);
}
tmp = tmp->next;
}
getch();
return rc;
}
static int put_card() {
FILE *fp;
CARD *tmp;
int rc=0;
OPEN(fp,fname,"w");
tmp = head;
if (tmp->next == head) {
puts("空 리스트입니다");
getch();
return ++rc;
}
else
while(tmp->next != head) {
if (*tmp->name != '\0') {
printf("\n%p %p",tmp, tmp->next);
printf("\n%-16s\t%-16s", tmp->name,tmp->phon);
fprintf(fp, "%-16s\t%-16s\n", tmp->name,tmp->phon);
}
tmp = tmp->next;
}
fclose(fp);
if (ferror(fp))
error("Can\'t close data_file");
getch();
return rc;
}
static int get_card() {
FILE *fp;
char *cp;
int rc=0;
CARD *tmp;
OPEN(fp,fname,"r");
while(fgets(buf, RCSZ, fp) != NULL) {
cp=buf;
while(*cp != '\n') ++cp; // '\n' -> '\0'
*cp='\0';
if ((tmp = ins_node(curr)) == NULL)
error("Out of memory");
curr = tmp;
strcpy(curr->name, strtok(buf, "\t"));
strcpy(curr->phon, strtok(NULL,"\t"));
}
fclose(fp);
if (ferror(fp))
error("Can\'t close data_file");
return rc;
}
void del_node(CARD *curr) {
CARD *tmp;
tmp = curr->next;
curr->next = curr->next->next;
free(tmp);
}
int get_jno(void) {
char *scr="..\\scr\\CARD00.SCR";
int n;
scrdis(scr);
gotoxy(45, 9); clreol();
do {
n = getche() - '0';
} while (n < 0 || n > 4);
return n;
}
void scrdis(char *ifle) { //Text 파일을 화면에 띄움
int ch,lin=0,y=0;
char buf[RCSZ],*cp=buf;
FILE *ifp;
clrscr(); y=0;
OPEN(ifp,ifle,"r");
while ((ch = getc(ifp)) != EOF) {
*cp++ = ch;
if (ch != '\n') continue;
lin++;
*(cp-1) = '\0';
if (lin < 24) {
gotoxy(1,++y); printf("%-80s",buf);
cp = buf;
continue;
}
}
fclose(ifp);
}
void error(char *str) {
printf("Error: %s(%s).\n",str,fname);
getch();
exit(-1);
}
/* edit로 만든 텍스트 화면
..\scr\CARD00.SCR
<명함관리 주메뉴>
0. 작업 종료
1. 신규 명함 입력
2. 등록 명함 조회
3. 명함 목록 list
4. 명함 파일 저장
5. 기존 명함 삭제
작업번호 선택: _
..\scr\CARD01.SCR
명함 입력 (성명란에 냉무 & Enter: 입력종료)
1. 성 명:
2. 전 화:
..\scr\CARD02.SCR
성 명 전 화 번 호
................ ................
*/
728x90