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;
}