Menu



Manage

Study_C > 13-make.c Lines 158 | 5.0 KB
다운로드

                        /*****************************************************************

 * 주소록 저장하는 프로그램


 ********************************************************************/

#define _CRT_SECURE_NO_WARNINGS						// scanf오류 제거를 위한 코드
#include<stdio.h>			    					// 표준 입출력장치 사용을 위한 헤더파일 로드
#include <string.h>									// 문자열 비교를 위한 함수 라이브러리 추가
#define SIZE 100									// 입력받을 인원수를 설정

typedef struct person {								// 연락처를 구조체 타입으로 표시
	char name[SIZE];								// 이름
	char addr[SIZE];								// 주소
	char monum[SIZE];								// 모바일 넘버 /핸드폰번호
	char desc[SIZE];								// 특징
}Person;

void menu();										// 메뉴를 표시하는 함수
Person get_record();								// 데이터를 입력받아 구조체로 만들어주는 함수
void add_record(FILE* fp);							//새 데이터 추가 함수
void update_record(FILE* fp);						// 데이터 변경 함수
void search_record(FILE* fp);						// 데이터 탐색 함수
void print_record(Person data);						// 구조체 데이터 출력 함수

int main()
{
	FILE *fp = NULL ;								// 파일 구조체 정의를 이용한 파일 열기
	int select = 0 ;								// 고를 정수를 저장할 변수 생성

	// 이진 파일을 추가 모드로 오픈하기
	if ((fp = fopen("address.dat", "a+")) == NULL) {
		fprintf(stderr, "입력을 위한 파일을 찾을 수 없습니다.");		//파일이 제대로 생성되지 않은경우
		exit(1);
	}
	while (1) {
		menu();
		printf("정수값을 입력해주세요 : ");
		scanf("%d%*c", &select);					//메뉴 선택 %*c는 버퍼에 차지한 자리를 비워 gets 함수를 쓰기 위함
		switch (select) {
		case 1: add_record(fp); break;				//데이터 추가하기
		case 2: update_record(fp); break;			//데이터 수정
		case 3: search_record(fp); break;			//데이터 탐색
		case 4: return 0;							//종료
		}
	}
	fclose(fp);										//파일 fp종료
	return 0;										//정상종료
}

// 메뉴를 표시하는 함수
void menu()
{
	printf("\n==============================\n");
	printf("1. 추가\n2. 수정\n3. 검색\n4. 종료\n");
	printf("==============================\n");
}

// 새 데이터 추가 함수
void add_record(FILE *fp)
{
	Person data;									// Person 구조체 생성
	data = get_record();							// 사용자로부터 데이터를 받아 구조체에 저장
	fseek(fp, 0, SEEK_END);							// 파일의 끝으로 이동
	fwrite(&data, sizeof(data), 1, fp);				// 구조체 데이터를 파일에 쓴다.
}

// 데이터 변경 함수
void update_record(FILE* fp)
{
	printf("내부 변경할바에는 파일 지우고 다시 입력하는게 빠르답니다.");
	fclose(fp);															// 삭제를 위해 파일 닫기
	if (remove("address.dat") == -1) {									// 파일 삭제 시도
		printf("파일 삭제에 실패했습니다. \n강제 종료합니다.");			// 실패시 시스템 종료
		exit(1);
	}
	printf("파일 삭제 완료");											

	// 이진 파일을 추가 모드로 오픈하기
	if ((fp = fopen("address.dat", "a+")) == NULL) {
		fprintf(stderr, "입력을 위한 파일을 찾을 수 없습니다.");		//파일이 제대로 생성되지 않은경우
		exit(1);
	}
	printf("처음 화면으로 돌아갑니다.");

	/*char name[SIZE];
	Person data;

	fseek(fp, 0, SEEK_SET);
	getchar();
	printf("변경하고자 하는 사람의 이름을 입력하세요 : ");
	gets_s(name, SIZE);
	while (!feof(fp)) {
		fread(&data, sizeof(data), 1, fp);
			if (strcmp(data.name, name) == 0) {
			printf("변경할 이름 : ");
			gets_s(data.name, SIZE);
			printf("변경할 주소 : ");
			gets_s(data.addr, SIZE);
			printf("변경할 휴대폰 번호 : ");
			gets_s(data.monum, SIZE);
			printf("변경할 특징 : ");
			gets_s(data.desc, SIZE);
			fwrite(&data, sizeof(data), 1, fp);
			return;
		}
	}
	("없는 사람입니다. 처음 화면으로 돌아갑니다.");*/
}


// 데이터 탐색 함수
void search_record(FILE* fp)
{
	char name[SIZE] = { 0 };													// 검색할 이름을 저장할 변수 생성
	Person data;																// Person 구조체 생성

	fseek(fp, 0, SEEK_SET);														// 파일의 처음으로 이동
	getchar();																	// 줄바꿈 문자 없애기
	printf("탐색하고자 하는 사람의 이름을 입력하세요 : ");
	gets_s(name, SIZE);															// 이름 입력
	while (!feof(fp)) {															// 파일의 끝까지 반복
		fread(&data, sizeof(data), 1, fp);										// 현재 위치에서 데이터 읽기
		if (strcmp(data.name, name) == 0) {										// 이름 비교
			print_record(data);													// 일치할 경우 데이터 출력 함수 실행
			return;
		}
	}
	printf("없는 사람입니다. 처음 화면으로 돌아갑니다.");						// 없는경우 경고문
}

// 데이터를 입력받아 구조체로 만들어주는 함수
Person get_record()
{
	Person data;																// Person 구조체 생성
	
	getchar();																	// 줄바꿈 문자 없애기
	printf("이름 : ");
	gets_s(data.name, SIZE);													// 이름 입력
	printf("주소 : ");
	gets_s(data.addr, SIZE);													// 주소 입력
	printf("휴대폰 번호 : ");
	gets_s(data.monum, SIZE);													// 핸드폰번호 입력
	printf("특징 : ");
	gets_s(data.desc, SIZE);													// 특징 입력
	return data;
}

// 구조체 데이터 출력 함수
void print_record(Person data)
{
	printf("이름 : %s\n", data.name);											// 이름 출력
	printf("주소 : %s\n", data.addr);											// 주소 출력
	printf("휴대폰 : %s\n", data.monum);										// 핸드폰번호 출력
	printf("특징 : %s\n", data.desc);											// 특징 출력
}