본문 바로가기

C언어/프로젝트

도서관리 프로그램 v1.0 (저수준 입출력 사용) 수정中

저수준 입출력을 사용한 도서 관리 프로그램 v1.0 (2010년 12월 29일 수요일)
사용언어 : C
운영체제 : 리눅스(Ubuntu)
개발도구 : vi 편집기
#include <stdio.h>
#include <fcntl.h>    // oflag 사용을 위함 
#include <sys/stat.h>  // pmode 사용을 위함 
//#include <stdlib.h>
//#include <string.h>
//#include <curses.h>
//#include <unistd.h>
//#include <sys/types.h>

typedef struct tag_booktype
{
  char book[30];
  char author[15];
  char publiser[15];
  char price[15];
  char year[15];
} booktype;

void list(int iInfo);
void insert(void);

int main()
{
  int iFd;
  char iSelect;
  int iCnt=0;
  
  system("clear");
  do {  // 메인 화면 
    if((iFd=open("BOOK.DBF",O_RDWR)) >= 0)
    {  // 파일이 있을 경우만 실행 (보유 현황 표시)
      iCnt=0;
      while(read(iFd, &iSelect, 1) != 0)
      {
        if(iSelect == '\n')
        {
          iCnt++;
        }
      }
    }
  
    close(iFd);
    printf("┏━━━━━━━━━┓\n");
    printf("┃책 보유 현황 : %03d┃\n", iCnt);
    printf("┗━━━━━━━━━┛\n\n");
    printf("┏━ 메뉴선택화면 ━┓\n");
    printf("┃     1.insert     ┃\n");
    printf("┃     2. list      ┃\n");
    printf("┃     3. quit      ┃\n");
    printf("┗━━━━━━━━━┛\n");
    printf(" select : ");
    scanf("%c"&iSelect);
    __fpurge(stdin);
    switch(iSelect)
    {  // 메뉴 선택 설정 
      case '1':
      insert();  // insert함수호출
      break;
    
      case '2':
      list(iCnt);    // list함수호출
      break;

      case '3':  // 종료!!
      break;

      default:  // 선택 오류시 출력!
      printf(" select Error. You select continue.\n");
      break;
    }
  } while('3' != iSelect);  // 메뉴 조건 설정!
  printf(" Books supervision end program.\n");  // 종료 메시지!!
  return 0;
}

void insert(void)
{  // 파일에 정보 추가 설정!
  booktype fIn;
  int iCnt=0;
  int infd;
  char cQuit;

  if((infd=open("BOOK.DBF",O_RDWR|O_APPEND)) < 0)
  {  // 만약 BOOK 파일이 없을 경우 새로 만듬!!
    infd=creat("BOOK.DBF", S_IREAD|S_IWRITE);
    close(infd);
    open("BOOK.DBF", O_RDWR);
  }
  
  do {  // 책 정보 입력!!
    printf("============ [%03d] =============\n", ++iCnt);
    printf("책 이 름 : ");
    scanf("%[^\n]"&fIn.book);  // 공백도 입력 가능!
    __fpurge(stdin);
    fIn.book[strlen(fIn.book)+1]=0;
    fIn.book[strlen(fIn.book)]='|';
    write(infd, fIn.book, strlen(fIn.book));
    
    printf("저    자 : ");
    scanf("%[^\n]"&fIn.author);
    __fpurge(stdin);
    fIn.author[strlen(fIn.author)+1]=0;
    fIn.author[strlen(fIn.author)]='|';
    write(infd, fIn.author, strlen(fIn.author));
    
    printf("출 판 사 : ");
    scanf("%[^\n]"&fIn.publiser);
    __fpurge(stdin);
    fIn.publiser[strlen(fIn.publiser)+1]=0;
    fIn.publiser[strlen(fIn.publiser)]='|';
    write(infd, fIn.publiser, strlen(fIn.publiser));
    
    printf("가    격 : ");
    scanf("%[^\n]"&fIn.price);
    __fpurge(stdin);
    fIn.price[strlen(fIn.price)+1]=0;
    fIn.price[strlen(fIn.price)]='|';
    write(infd, fIn.price, strlen(fIn.price));
    
    printf("출판연도(00/00/00) : ");
    scanf("%[^\n]"&fIn.year);
    __fpurge(stdin);
    fIn.year[strlen(fIn.year)+1]=0;
    fIn.year[strlen(fIn.year)]='\n';
    write(infd, fIn.year, strlen(fIn.year));
    
    printf("아무키나 누르면 계속 끝내려면 'Q' 입력 : ");
    scanf("%c"&cQuit);
    __fpurge(stdin);  // 입력버퍼에 남아있는 찌꺼지 초기화!
  } while(('q' != cQuit)&&('Q' != cQuit));
  close(infd);
  system("clear");
  return;
}
void list(int iInfo)
{  // 파일 안의 정보 출력!
  booktype fList;
  int iCnt=0;
  int iPage=0;
  int iFD;
  int iFind;
  int iFCnt;
  int iEnd;
  int iTemp;
  char cQuit;
  char buffer;
  char cHelp;
  
  system("clear");
  if((iFD=open("BOOK.DBF",O_RDWR)) < 0)
  {  // 파일이 없을 경우 아래 메시지 출력!!
    printf(====================\n");
    printf("   No found File....\n");
    printf(====================\n");
    return;
  }
  
  printf("=========== LIST INFOMATION ============\n");
  do {  // 책 정보 출력!!
    printf("========== [%03d] NUMBER LIST ===========\n", ++iPage);
    
    for(iCnt=0; buffer != '|'; iCnt++)
    {  // 특수문자를 만날때까지 1바이트씩 읽어 버퍼에 저장!
      read(iFD, &buffer, 1);
      fList.book[iCnt]=buffer;
    }
    fList.book[iCnt-1]=0;  // 마지막 특수문자 삭제를 위함!
    for(iCnt=0,buffer=0; buffer != '|'; iCnt++)
    {
      read(iFD, &buffer, 1);
      fList.author[iCnt]=buffer;
    }
    fList.author[iCnt-1]=0;
    for(iCnt=0,buffer=0; buffer != '|'; iCnt++)
    {
      read(iFD, &buffer, 1);
      fList.publiser[iCnt]=buffer;
    }
    fList.publiser[iCnt-1]=0;
    for(iCnt=0,buffer=0; buffer != '|'; iCnt++)
    {
      read(iFD, &buffer, 1);
      fList.price[iCnt]=buffer;
    }
    fList.price[iCnt-1]=0;
    for(iCnt=0,buffer=0; buffer != '\n'; iCnt++)
    {  // 책 한권 정보의 마지막!
      iEnd=read(iFD, &buffer, 1);
      fList.year[iCnt]=buffer;
    }
    fList.year[iCnt-1]=0;
    // 책 정보 출력 
    printf("책 이 름 : ");
    printf("%s", fList.book);
    printf("\n저    자 : ");
    printf("%s", fList.author);
    printf("\n출 판 사 : ");
    printf("%s", fList.publiser);
    printf("\n가    격 : ");
    printf("%s", fList.price);
    printf("\n출판연도 : ");
    printf("%s", fList.year);
    
    if(read(iFD, &buffer, 1== 0)
    {  // 파일의 끝부분이면 출력 종료!
      printf("\n마지막 책의 정보 입니다. 종료하겠습니다.");
      getchar(); // 종료하기전 대기!
      __fpurge(stdin);
      break;  
    }
    lseek(iFD, -1, SEEK_CUR); // 파일의 끝부분을 찾기위한 설정!
    printf("\n계속:Enter 도움말'H' 끝내기'Q' : ");
    scanf("%c"&cQuit);
    __fpurge(stdin);
    iTemp=iPage;
    
    if(('H' == cQuit)||('h' == cQuit))
    {  // 도움말 메뉴 부분! 
      do {
      printf("========================================\n");
      printf("============== Help  Menu ==============\n");
      printf("========================================\n");
      printf("===    현재 책 보유량 : 총 %03d권!    ===\n", iInfo);
      printf("========================================\n");
      printf("===     Q   : Help Menu EXIT         ===\n");
      printf("===     F   : Find list line         ===\n");
      printf("========================================\n");
      printf(">>원하는 항목을 선택하세요 : ");
      cHelp=getchar();
      __fpurge(stdin);
      if((cHelp == 'f')||(cHelp == 'F'))
      {  // 도움말 메뉴에서 'F' 선택시 원하는 책 라인으로 이동!
        printf("========================================\n");
        printf("찾고 싶은 위치를 입력해 주세요(숫자) : ");
        scanf("%d"&iPage);
        __fpurge(stdin);
        if((0 < iPage) && (iInfo >= iPage))
        {  // 1 ~ 총 보유량까지만 입력 가능!
          lseek(iFD, 0, SEEK_SET);  // 파일위치를 제일 처음으로 이동!
          for(iFCnt=0; iFCnt<iPage-1; )
          {  // 한권의 책정보를 찾기 위함!
            read(iFD, &buffer, 1);
            if(buffer == '\n')
            {  // 한권의 책정보를 찾으면 파일카운터 1씩 올림!
              iFCnt++;
            }          
          }
          iPage-=1;
          cHelp='q';
          printf("========================================\n\n");
        }
        else
        {  // 만약 찾는 위치가 1이하거나 보유량을 넘을 경우 실행!
          system("clear");
          printf("============= Error Report =============\n");
          printf("========================================\n");
          printf("= 선택한 범위에는 책의 정보가 없습니다.=\n");
          printf("========================================\n\n");
          iPage=iTemp;  // 입력 오류시 다음 책 페이지 정보!
        }
      }
      } while(('q' != cHelp)&&('Q' != cHelp));
    }
  } while(('q' != cQuit)&&('Q' != cQuit));
  close(iFD);
  printf("========================================\n");
  printf("========= END LIST INFOMATION ==========\n");
  return;
}



'C언어 > 프로젝트' 카테고리의 다른 글

리눅스 pcap 활용한 패킷 아날라이져  (0) 2011.03.09