Unreal C++/Text File IO2018. 9. 12. 19:21

C++ 텍스트파일 CRUD 예제


구성 파일

Member 클래스 (Member.h, Member.cpp)

번호, 이름, 이메일, 전화번호를 저장할 수 있는 회원정보 데이터 모델


MemberIO 클래스 (MemberIO.h, MemberIO.cpp)

파일에 저장된 회원정보 4가지를 입출력 하는 모든 기능

추가, 수정, 삭제, 검색, 리스트, 회원수 확인 등


main.cpp ( main함수와 그 외 서비스 함수들)

프로그램의 흐름을 관리하며 이용자로부터 키보드 입력을 받아 기능을 호출하고 화면에 표시하는 모든 기능



Member.h

#pragma once

#include <string>


using namespace std;


class Member

{

int num;

string name;

string email;

string phone;

public:

Member();

Member(int num, string name, string email, string phone);

void set_num(int num);

void set_name(string name);

void set_email(string email);

void set_phone(string phone);

int get_num();

string get_name();

string get_email();

string get_phone();

};


Member.cpp

#include "Member.h"


Member::Member(){}


Member::Member(int num, string name, string email, string phone)

:num(num), name(name), email(email), phone(phone)

{}


void Member::set_num(int num) { this->num = num; }


void Member::set_name(string name){ this->name = name;}


void Member::set_email(string email){ this->email = email;}


void Member::set_phone(string phone){ this->phone = phone;}


int Member::get_num() { return num; }


string Member::get_name() { return name; }


string Member::get_email(){ return email; }


string Member::get_phone(){ return phone; }



MemberIO.h

#pragma once

#include <string>

#include "Member.h"


using namespace std;


class MemberIO

{

string filepath;

public:

int curr_cnt;

MemberIO();

MemberIO(string filepath);

Member* list();

bool add(Member& m);

Member search(string name);

bool update(Member& m);

bool del(string name);

int get_count();

private:

bool overwrite(string* arr, int cnt);

};


MemberIO.cpp

#include "MemberIO.h"

#include <fstream>

#include <iostream>

#include <sstream>


using namespace std;


MemberIO::MemberIO(){

this->filepath = "D:\\test\\mem.txt";

}


MemberIO::MemberIO(string filepath){

this->filepath = filepath;

}


Member * MemberIO::list(){

int cnt = get_count();

if (cnt == 0) { 

cout << "회원정보가 아직 없음" << endl; 

return nullptr;

}

Member* pm = new Member[cnt];

ifstream fin(filepath);

if (!fin.is_open()) {

cout << "파일열기 오류" << endl;

return nullptr;

}

string line, name, email,phone;

int num, idx = 0;

stringstream ss;

while (!fin.eof()) {

getline(fin, line);

if (line.length() == 0) break;


ss.str(line);

ss >> num >> name >> email >> phone;

pm[idx++] = Member(num, name, email, phone);

ss.clear();

line.clear();

}

fin.close();

return pm;

}


bool MemberIO::add(Member& m){

ofstream fout(filepath, ios::app);

if (!fout.is_open()) {

cout << "파일 열기 오류" << endl;

return false;

}

fout << m.get_num() << " " << m.get_name() << " " << m.get_email() << " " << m.get_phone() << endl;

fout.close();

return true;

}


Member MemberIO::search(string name){

ifstream fin(filepath);

if (!fin.is_open()) {

cout << "파일 열기 오류" << endl;

throw exception("파일열기 오류") ;

}

string line;

int cnt = 0;

stringstream ss;

int num;

string fname, email,phone;

Member m;

while (!fin.eof()) {

getline(fin, line);

ss.str(line);

ss >> num >> fname;

if (fname == name) {

ss >> email >> phone;

fin.close();

return Member(num, fname, email, phone);

}

}

fin.close();

throw exception("검색실패") ;

}


bool MemberIO::update(Member & m){

int cnt = get_count();

ifstream fin(filepath);

string* all_lines = new string[cnt];

string line,num,name,email,phone;

stringstream ss;

int idx = 0;

while (!fin.eof()) {

getline(fin, line);

if (line.length() == 0) break;

ss.str(line);

ss >> num >> name;

if (name == m.get_name()) {

ss >> email >> phone;

stringstream ss2;

ss2 << num <<" "<< name <<" "<<

m.get_email() <<" "<< phone;

all_lines[idx++] = ss2.str();

ss2.clear();

}

else {

all_lines[idx++] = line;

}

ss.clear();

}

bool ok = overwrite(all_lines, idx);

cout << "업데이트 결과:" << ok << endl;

return true;

}


bool MemberIO::del(string name){

int cnt = get_count();

ifstream fin(filepath);

string* all_lines = new string[cnt-1];

string line, num, fname;

stringstream ss;

int idx = 0;

while (!fin.eof()) {

getline(fin, line);

if (line.length() == 0) break;

ss.str(line);

ss >> num >> fname;

if (fname != name) {

all_lines[idx++] = line;

}

ss.clear();

}

bool ok = overwrite(all_lines, idx);

cout << "삭제 결과:" << ok << endl;

return true;

}


int MemberIO::get_count(){

ifstream fin(filepath);

if (!fin.is_open()) { 

cout << "파일 열기 오류" << endl;

return -1;

}

string line;

int cnt = 0;

while (!fin.eof()) {

getline(fin, line);

if(line.length()!=0) cnt++;

line.clear();

}

fin.close();

curr_cnt = cnt;

return cnt;

}


bool MemberIO::overwrite(string * arr, int cnt)

{

ofstream fout(filepath);

if (!fout.is_open()) {

cout << "파일 열기 오류" << endl;

return false;

}

for (int i = 0; i < cnt; i++) {

fout << arr[i] << endl;

}

fout.close();

delete[]arr;

return true;

}


main.cpp

#include <iostream>

#include <fstream>

#include <string>

#include <sstream>

#include "MemberIO.h"


using namespace std;


enum Menu { LIST, SEARCH, ADD, UPDATE, DELETE, EXIT };


void print_menu() {

cout << "\t----------------------------------------------------------------" << endl;

cout << "\n\t회원관리: 목록(p), 추가(a), 검색(s), 수정(u), 삭제(d), 종료(x) :";

}

Menu get_user_menu() {

string input;

getline(cin, input);

stringstream ss(input);

char m;

ss >> m;


Menu menu = LIST;

switch (m) {

case 'p': menu = LIST; break;

case 'a': menu = ADD; break;

case 's': menu = SEARCH; break;

case 'u': menu = UPDATE; break;

case 'd': menu = DELETE; break;

case 'x': menu = EXIT; break;

}

return menu;

}

void print_list(Member* pm, int cnt) {

cout << "\n\t----------------------------------------------------------------" << endl;

for (int i = 0; i < cnt; i++) {

if(pm[i].get_name().empty()) break;

cout << pm[i].get_num() << "\t\t" << pm[i].get_name() << "\t\t"

<< pm[i].get_email() << "\t\t" << pm[i].get_phone() << endl;

}

delete[]pm;

}

Member add() {

cout << "\n번호 이름 이메일 전화번호를 공백으로 구분하여 입력:";

int num;

string name;

string email;

string phone;

cin >> num >> name >> email >> phone;

Member m(num, name, email, phone);

string line;

getline(cin, line);

return m;

}

string search() {

cout << "\n검색할 회원의 이름:";

string name;

getline(cin, name);

return name;

}

void print_mem(Member& m) {

cout << "\n검색결과----------------------------------------------------------------" << endl;

cout << m.get_num() << "\t" << m.get_name() << "\t"

<< m.get_email() << "\t" << m.get_phone() << endl;

}

Member update_info() {

cout << "\n수정할 회원의 이름, 이메일 입력:";

string input, name, email;

getline(cin, input);

stringstream ss(input);

ss >> name >> email;

ss.clear();


Member m;

m.set_name(name);

m.set_email(email);

return m;

}

string get_del_name() {

cout << "\n삭제할 회원의 이름:";

string name;

getline(cin, name);

return name;

}


int main()

{

MemberIO mio("D:\\test\\mem.txt");


cout << "\t\t\t\t** 회원관리 프로그램 **" << endl;

cout << "\t\t\t\t=======================" << endl;

bool go = true, saved=false;

Member* pm = 0;

Member mem;


while (go) {

print_menu();

Menu m = get_user_menu();


switch (m) {

case LIST:

pm = mio.list();

print_list(pm, mio.curr_cnt);

break;

case ADD:

mem = add();

saved = mio.add(mem);

cout << "파일에 추가:" << saved ? "성공" : "실패";

cout << endl;

break;

case SEARCH:

try { 

Member m = mio.search(search()); 

print_mem(m);

}catch (exception& e) { cerr << e.what() << endl; }

break;

case UPDATE:

mem = update_info();

mio.update(mem);

break;

case DELETE:

mio.del(get_del_name());

break;

case EXIT: go = false; break;

}

}

cout << "\n프로그램 종료...." << endl;


return  0;

}


Posted by cwisky