관리 메뉴

moozi

파일입출력 클래스 버전 -주소록 본문

C++

파일입출력 클래스 버전 -주소록

moozi 2015. 11. 3. 14:02

#include <iostream>
#include <fstream>
using namespace std;

class Address
{
 private:
  char processNumber[10]; // Menu번호를 저장하는 변수
  int quit; // 종료여부를 판단하기 위한 변수(1이면 종료)

 public:
  void intro(); // 초기 화면을 출력하는 함수
  void seletMenu(); // 메뉴선택을 요구하는 함수
  void inputPN(); // 메뉴번호를 입력받아 처리하는 함수
  void readAddress(); // 주소록을 읽는 함수
  void writeAddress(); // 주소록에 쓰는 함수
  void searchAddress(); // 주소록을 검색하는 함수
  int checkQuit(); // quit의 값을 읽는 함수
  void ProcessQuit(); // 프로그램을 종료하기 위한 함수
};

/* 초기 화면을 출력하는 함수 */
void Address::intro()
{
 /* 프로그램 제목을 출력합니다. */
 cout << "********************************************** \n";
 cout << "*                                            * \n";
 cout << "*                나의 주소록                 * \n";
 cout << "*                                            * \n";
 cout << "********************************************** \n"; 
}

/* 메뉴선택을 요구하는 함수 */
void Address::seletMenu()
{
 cout << "\n"; //한줄 띄웁니다.
 cout << "====MENU==== \n";
 cout << "목록보기 : 1 \n";
 cout << "입력하기 : 2 \n";
 cout << "검색하기 : 3 \n";
 cout << "종료하기 : 4 \n";
 cout << "============ \n";
 cout << "MENU 번호를 선택하세요 : ";
}

/* 메뉴번호를 입력받아 처리하는 함수 */
void Address::inputPN()
{
 cin.getline(processNumber,sizeof(processNumber));

 /* 사용자의 입력이 잘 못 되면 반복해서 다시 받는다. */
 while ((atoi(processNumber)!=1) && (atoi(processNumber)!=2)
   && (atoi(processNumber)!=3) && (atoi(processNumber)!=4))
 {
  seletMenu();
  cin.getline(processNumber,sizeof(processNumber));
 }

 if (atoi(processNumber)==1)
  readAddress();
 else if (atoi(processNumber)==2)
  writeAddress();
 else if (atoi(processNumber)==3)
  searchAddress();
 else if (atoi(processNumber)==4)
  ProcessQuit();
}

/* 주소록을 읽는 함수 */
void Address::readAddress()
{
 char list[300];
  
 ifstream AddressList("주소록.txt");
 if(!AddressList)
 {
  cout << "주소록파일을 열 수 없습니다. \n";
  quit=1;
 }
 else
 { 
  cout << "\n"; //한줄 띄웁니다.
  cout << ">>>> 주소록 목록 <<<< \n";
  
  while(!AddressList.eof())
  {
   AddressList.getline(list,sizeof(list));
   cout << list << "\n";
  }
  
 }
 
 AddressList.close(); // 파일닫기  
}

/* 주소록에 쓰는 함수 */
void Address::writeAddress()
{
 ofstream wAddress("주소록.txt", ios::app);//파일의 끝에 데이터를 추가합니다.

 /* 파일을 여는데 실패하면 프로그램을 종료합니다. */
 if(!wAddress)
 {
  cout <<"주소록파일을 열 수 없습니다. \n";
  quit=1;
 }
 else
 {
  char name[20]; //이름
  char address[100]; //주소
  char handphone[20]; //핸드폰
    
  cout << "\n";
  cout << "이름입력 : ";
  cin.getline(name,sizeof(name));
  cout << "주소입력 : ";
  cin.getline(address,sizeof(address));
  cout << "핸드폰번호입력 : ";
  cin.getline(handphone,sizeof(handphone));

  wAddress << name << ", ";
  wAddress << address << ", ";
  wAddress << handphone << "\n";
  
  wAddress.close(); // 파일을 닫습니다.
 }
}

/* 주소록을 검색하는 함수 */
void Address::searchAddress()
{
 char * searchResult; // 검색결과를 저장하는 변수
 int findCounter=0; //키워드검색시 발견횟수를 저장하기 위한 변수
 ifstream sAddress("주소록.txt");
 if(!sAddress)
 {
  cout << "주소록파일을 열 수 없습니다. \n";
  quit=1;
 }  
 else
 {
  char keyWord[30]; // 검색어를 저장하는 변수
  cout << "\n"; // 한줄 띄웁니다.
  cout << "검색어를 입력하세요 :  ";
  cin.getline(keyWord,sizeof(keyWord));
  cout << "\n"; // 한줄 띄웁니다.
  cout << ">>>> 검색결과 <<<< \n";
  
  while (sAddress)
  {
   char sAddressList[300]; // 주소록의 한 행을 읽어서 저장하기 위한 변수
   sAddress.getline(sAddressList,sizeof(sAddressList));
   
   searchResult = strstr(sAddressList, keyWord); // 한 행의 주소에 검색어가 포함되는지 확인
   
   /* 검색어가 발견되면 해당행을 출력한다. */
   if( searchResult )
   {
    cout << sAddressList << "\n";
    ++findCounter; // 발견횟수 증가
   }
  }
    
  /* 검색자료가 없습니다. 출력하기*/
  if(findCounter==0) // 발견횟수가 0이면 검색자료가 없습니다.
  {
   cout << "검색자료가 없습니다. \n";
  }
  
  sAddress.close(); 
 } 
}

/* quit의 값을 읽는 함수 */
int Address::checkQuit()
{
 return quit;
}

/* 프로그램을 종료하기 위한 함수 */
void Address::ProcessQuit()
{
 cout << "... 프로그램이 종료되었습니다.\n";

 quit = 1;
}

/* main()함수입니다.*/
int main()
{
 Address myAddress; // Address클래스를 이용해서 객체를 생성합니다.

 myAddress.intro(); // 주소록 초기화면을 출력합니다.

 while(myAddress.checkQuit()!=1) // 종료조건이 아닌 경우 반복합니다.
 {
  myAddress.seletMenu(); // 사용자가 Menu를 선택하도록 합니다.
  myAddress.inputPN(); // 사용자가 선택한 Menu에 따라 처리합니다.
 }

 return 0;
}

 

'C++' 카테고리의 다른 글

끝말잇기게임 클래스 버전  (0) 2015.11.17
끝말잇기게임  (0) 2015.11.12
파일입출력예제 클래스버젼  (0) 2015.10.30
파일입출력 예제  (0) 2015.10.27
Comments