easy software

C언어 전화번호 관리 프로그램에 File IO 기능을 추가하여 효율개선 본문

C언어/기타

C언어 전화번호 관리 프로그램에 File IO 기능을 추가하여 효율개선

JAVA 웹개발자 2015. 4. 24. 21:48

안녕하세요. 정말 오랜만에 글을 작성합니다.

 

개강하고 각종 과제와 퀴즈 준비 때문에 글을 올릴 시간이 턱없이 부족하네요.

 

이번에는 C언어의 마지막 글이라고 봐도 될 거 같습니다.

 

제 블로그의 C언어 - 기타 카테고리의 글 중에 전화번호 관리 프로그램이란 글이 있습니다.

 

그 프로그램에서는 사용자의 이름과 전화번호를 입력받고, 지우고, 찾아주고, 출력해주는

 

그런 기능들이 포함된 프로그램이었습니다.

 

그런데 문제는 단순히 그런 기능들만 가지고 있지, 실제로 써먹을 수가 없다는거죠.

 

입력한 정보를 어디에 저장이라도 해두면,

 

나중에라도 다시 사용하기가 편리할텐데 그러질 않으니까요.

 

그래서 이번엔 File IO 기능을 추가해서 실제로 입력 후 저장하고, 다시 프로그램을 실행하면

 

저장되어있던 데이터를 불러와서 다시 작업할 수 있는 실효성있는 프로그램으로 개선했습니다.

 

 

-추가된 기능1 : 프로그램을 종료하면 파일에 데이터를 저장

-추가된 기능2 : 프로그램을 실행하면 파일에 저장되어있던 데이터를 읽어들여,

구조체 배열에 저장

 

 

 

 

실행화면은 아래와 같습니다.

 

 

* 초기에 데이터가 없는 상황에서 정보를 입력하고 텍스트 파일에 저장

 

 

 

 

 

* 텍스트 파일에 데이터가 저장되었는지 확인

 

 

 

 

 

 

* 프로그램을 재실행하여 저장된 데이터를 불러오고, 이어서 새로운 데이터를 저장

 

 

 

 

 

 

* 새로운 데이터가 이어서 저장되었는지 확인

 

 

 

 

 

 

아주 정확하게 데이터가 Read되고 Write됨을 알 수 있습니다.

 

그리고 참고로 텍스트파일은 이 프로그램의 디렉토리에 저장되어 있습니다.

 

이전 코드에서 추가된 함수는 saveFile()과 openFile()입니다.

 

주석을 아주 상세히 달아놨고, 효율을 개선하기 전의 전화번호 관리 프로그램과 비교하면서 코드를

 

보시면 금방 이해되실거 같아서 굳이 긴 글에 설명은 달지 않겠습니다.

 

 

 

빨간색 코드는 추가된 코드입니다.

 

#include <stdio.h>
#include <string.h>

 

//추후 유지보수를 편히 하기위해 100이란 숫자를
//MAX_NUM으로 설정, 100을 200으로 바꾸면
//MAX_NUM은 200이 됨
#define MAX_NUM 100

 

//사용자의 정보를 저장하는 구조체
typedef struct{
     char name[30];
     char number[30];
}User;

 

int saveFile(User* ptr, int* num);
int openFile(User* ptr, int* num);
void insert(User* ptr, int* num);
int deleted(User* ptr, int* num);
int search(User* ptr, int* num);
void printAll(User* ptr, int* num);

 

int main(void){
     int input;
     User user[MAX_NUM]; //사용자 정보를 저장할 구조체 배열
     int person = 0; //저장된 user수

 

     openFile(user, &person);//저장된 데이터를 불러오는 함수

 

     //메뉴 선택
     while (1){
          printf("***** Menu ***** \n");
          printf("1. Insert \n");
          printf("2. Delete \n");
          printf("3. Search \n");
          printf("4. Print All \n");
          printf("5. Save and Exit \n");

          printf("Choose the item: ");
          scanf("%d", &input);

 

          if (input == 1){
               printf("\n[INSERT] \n");
               insert(user, &person);
          }
          else if (input == 2){
               printf("\n[Delete] \n");
               deleted(user, &person);
          }
          else if (input == 3){
               printf("\n[Search] \n");
               search(user, &person);
          }
          else if (input == 4){
               printf("\n[Print All] \n");
               printAll(user, &person);
          }
          else if (input == 5){
               saveFile(user, &person);
               return 0;
          }
          else
               printf("\nError! ReTry! \n\n");
         }

return 0;

}

 

//데이터를 파일에 저장하는 함수
int saveFile(User* ptr, int* num){

     if (*num > 0){
          int i, state;
          FILE* fp = fopen("UserInfo.txt", "wt");

 

          /* fopen함수는 오류발생시 NULL을 리턴하므로
          파일 개방 중 오류발생시 프로그램을 종료 */
          if (fp == NULL){
               printf("File Open Error!\n");
               return 1;
          }

 

          //구조체 배열에 저장된 데이터를 파일에 저장
          //줄바꿈으로 구분하여 저장
          for (i = 0; i < *num; i++){
               fprintf(fp, "%s %s", ptr[i].name, ptr[i].number);
               fputc('\n', fp);
          }

 

          /* fclose함수는 종료시 오류가 발생하면
          0이 아닌 다른값을 리턴하므로 비정상 종료로 판단되면
          안내후 프로그램을 종료 */
          state = fclose(fp);
          if (state != 0){
               printf("File Close Error!\n");
               return 1;
          }
          printf("\n  Data Save \n");
          return 0;
     }

     else{
          printf("\n  Exit \n");
          return 0;
     }
}

 

//파일로부터 데이터를 불러오는 함수
int openFile(User* ptr, int* num){
     int state;
     char temp;
     FILE* fp = fopen("UserInfo.txt", "rt");

 

     if (fp == NULL){
          printf("File Open Error!\n");
          return 1;
     }

 

     //파일에 저장된 데이터를 구조체 배열에 저장
     while (1){
          fscanf(fp, "%s %s", ptr[*num].name, ptr[*num].number);
          if (feof(fp) != 0)
               break;
          (*num)++;
     }

 

     /* fclose함수는 종료시 오류가 발생하면
     0이 아닌 다른값을 리턴하므로 비정상 종료로 판단되면
     안내후 프로그램을 종료 */
     state = fclose(fp);
     if (state != 0){
          printf("File Close Error!\n");
          return 1;
     }

     return 0;
}

 

//사용자의 정보를 삽입하는 함수
void insert(User* ptr, int* num){

     //유저정보가 꽉 차지 않으면
     if (*num < MAX_NUM){
          printf("Input Name: ");
          scanf("%s", ptr[*num].name);
          printf("Input Tel Number: ");
          scanf("%s", ptr[*num].number);

          (*num)++;
          printf("  Data Inserted \n\n");
     }
     //유저 정보가 꽉 차면
     else
          printf("  Data Full \n\n");
    }

 

//사용자의 정보를 삭제하는 함수
int deleted(User* ptr, int* num){
     char name[30];
     int i, j;

 

     //유저 정보가 한개라도 남아있으면
     if (*num > 0){
          printf("Input Name: ");
          scanf("%s", name);

 

          for (i = 0; i < MAX_NUM; i++){
           //문자열이므로 비교하기위해 strcmp사용
               if (strcmp(name, ptr[i].name) == 0){

                    (*num)--;
                    printf("  Data Deleted \n\n");

                    //데이터가 가득 차지 않았다면
                    if (i != MAX_NUM - 1){
                         for (j = i; j < MAX_NUM; j++){
                              //문자열이므로 strcpy를 사용하여 데이터 복사
                              strcpy(ptr[j].name, ptr[j + 1].name);
                              strcpy(ptr[j].number, ptr[j + 1].number);
                         }
                         //구조체 배열의 마지막을 NULL로 바꿈
                         *ptr[MAX_NUM - 1].name = NULL;
                         *ptr[MAX_NUM - 1].number = NULL;
                    }


                        //데이터가 가득 찼다면
                    else{
                         //구조체 배열의 마지막을 NULL로 바꿈
                         *ptr[MAX_NUM - 1].name = NULL;
                         *ptr[MAX_NUM - 1].number = NULL;
                    }
               return 0;
               }
          }
          printf("Not Found \n\n");
          return 0;
     }


     //저장된 유저 정보가 없다면
     else{
          printf("  No Data \n\n");
          return 0;
     }
}

 

//사용자의 정보를 검색하는 함수
int search(User* ptr, int* num){
     char name[30];
     int i;

 

     //저장된 데이터가 있다면
     if (*num > 0){
          printf("Input Name: ");
          scanf("%s", name);

 

          for (i = 0; i < MAX_NUM; i++){
               //strcmp는 문자열이 일치할때 0을 반환
               //0은 C언어에서 거짓을 의미
               //그러므로 ! 을 붙여 참으로 변경하여 실행
               if (!strcmp(name, ptr[i].name)){

                    printf("Name : %s ", ptr[i].name);
                    printf("Tel : %s \n", ptr[i].number);

                    printf("  Data Found \n\n");
                    return 0;
               }
          }
      printf("Not Found \n\n");
      return 0;
     }
     else{
          printf("  No Data \n\n");
          return 0;
     }
}

 

//저장된 모든 이름과 전화번호 정보를 출력하는 함수
void printAll(User* ptr, int* num){
     int i = 0;

     if (*num > 0){
          for (i = 0; i < *num; i++){
               printf("Name : %s ", ptr[i].name);
               printf("Tel : %s \n", ptr[i].number);
          }
          printf("  Data Print \n\n");
     }
     else
          printf("  No Data \n\n");
}

Comments