Skip to content

Instantly share code, notes, and snippets.

@hsnks100
Last active September 18, 2017 03:24
Show Gist options
  • Save hsnks100/6306e95a06e70d7448659e7545ac201d to your computer and use it in GitHub Desktop.
Save hsnks100/6306e95a06e70d7448659e7545ac201d to your computer and use it in GitHub Desktop.
#include "FileControl.h"
CFileControl::CFileControl()
{
// Construct
this->top = filecheck(); //top에다가 대입
}
CFileControl::~CFileControl()
{
// Destruct
}
void CFileControl::dateadd(UseInfo date)
{
//
FILE* fp;
char buffer[5]; //파일명 담을 변수
itoa(this->top+1, buffer, 10); //top+1 의 숫자를 buffer 에다가 문자열로 변환;
fp = fopen(buffer, "wb");
fwrite(date.FullName, sizeof(char), 35, fp); // fp 파일에다가 이름 쓴다.
fwrite(&date.HaveMoney, sizeof(int), 1, fp); // fp 파일에다가 돈 쓴다.
fclose(fp);
++top; // 꼭대기 상승[?]
cout << top << "파일이 추가되었습니다." << endl;
}
void CFileControl::datedel(char* number) //삭제해서 뒤에 있는 파일 앞으로 끌어댕김;
{
//책 갈피.
int val;
val = atoi(number);
if(this->top < val || 0 > val || val == 0) //예외 처리.
{
cout << "그런 파일은 없는데요. 메뉴로 돌아갑니다." << endl;
}
else
{
char buffer[5]; //삭제 할 파일이름의 변수.
itoa(val, buffer, 10); //val 을 buffer 에 문자열로 변환해서 저장.
remove(buffer); //삭제.
for(int count=val; count<top; count++)
{
// 1,2,3,4,5 중에서 2번 파일 삭제한다면 1,3,4,5 이렇게 배열.
// 즉 1,2,3,4 로 바뀐다는 뜻. (차곡 차곡)
char oldbuffer[5]; //전 파일.
char newbuffer[5]; //새 파일.
itoa(count+1, oldbuffer, 10); // 삭제 한 파일 바로 뒤 파일명을 저장.
itoa(count, newbuffer, 10);//현재 파일명 저장. (oldbuffer 파일이 newbuffer 파일이 된다.)
LPCSTR OldFile = oldbuffer; // LPCSTR 형을 써야하므로
LPCSTR NewFile = newbuffer; // 이하 동문.
MoveFile(OldFile, NewFile); // 파일명 바꾸는 함수.
}
cout << val << "파일이 삭제되었습니다." << endl;
--top;
}
}
void CFileControl::dateedit(char* number,UseInfo date)
{
//
int val;
val = atoi(number);
/*
if(val > top || 0 > val) //파일이 없을 경우에.
{
cout << "그런 파일은 없습니다. : " << endl;
}
// 파일이 있으면.
else*/
{
FILE* fp;
char buffer[5];
itoa(val, buffer, 10);
fp = fopen(buffer, "wb");
fwrite(date.FullName, sizeof(char), 35, fp); //파일에다가 쓰기.
fwrite(&date.HaveMoney, sizeof(int), 1, fp); //파일에다가 쓰기.
fclose(fp);
cout << val << "파일이 수정(바꼈다는 뜻이다. 오해하지마라.) 되었습니다." << endl;
}
}
void CFileControl::dateview(char* number)
{
int val;
val = atoi(number);
if(this->top < val || 0 > val)
{
cout << "이에 해당하는 자료가 없습니다." << endl;
}
else
{
char buffer[5];
UseInfo temp; //파일 정보 저장.
FILE* fp;
itoa(val, buffer, 10);
fp = fopen(buffer, "rb");
fread(temp.FullName, sizeof(char), 35, fp); //파일 읽기.
fread(&temp.HaveMoney, sizeof(int), 1, fp); //파일 읽기.
fclose(fp);
cout << "이름 : " << temp.FullName << endl;
cout << "가진 돈 : " << temp.HaveMoney << endl;
}
}
void CFileControl::statusview()
{
//
if(top == 0)
{
cout << "데이터가 하나도 없습니다. 추가하실 수 있습니다." << endl;
}
else
{
cout << endl << endl << "꼭대기 파일은 " << this->top << " 번째 까지 있습니다." << endl;
}
}
bool CFileControl::isFull()
{
//꽉 찼으면 true 리턴.
return top == 1000;
}
void CFileControl::allview()
{
//
FILE* fp;
int filenum = 1;
char filename[5];
UseInfo temp; // 파일 정보 저장.
for(int count=0;count<top;count++)
{
itoa(count+1, filename, 10); // 보는 파일을 filename 에다가 저장.
fp = fopen(filename, "rb"); // filename 바이너리로 염.
fread(temp.FullName, sizeof(char), 35, fp); // temp.FullName 으로 이름 받음.
fread(&temp.HaveMoney, sizeof(int), 1, fp); // temp.HaveMoney 로 돈 받음.
/************************************************************************/
/* 출력하는 부분 */
/************************************************************************/
cout << "번호 " << count+1 << "." << endl;
cout << "\t이름 : " << temp.FullName << endl;
cout << "\t가진 돈 : " << temp.HaveMoney << endl;
fclose(fp);
// 한번에 5개씩만 보여주기 위해서.
if(count==4)
{
char temp;
cout << "아무 키나 누르면 더 볼 수 있습니다." << endl;
temp = getch();
}
}
}
void CFileControl::topview()
{
//
cout << this->top << "번 째 파일까지 있습니다." << endl;
}
void CFileControl::fileclear()
{
//
char buffer[5];
for(int count=1; count < 1001; count++)
{
itoa(count, buffer, 10);
remove(buffer);
}
top = 0;
cout << "파일 삭제 완료." << endl;
}
int filecheck()
{
FILE* fp;
for(int count=0; count < 1000; count++)
{
/************************************************************************/
/* 파일 열다가~~~ */
/************************************************************************/
char buffer[5];
itoa(count+1, buffer, 10);
fp = fopen(buffer, "rb");
//파일이 없으면 바로 리턴.
if(!fp)
{
return count;
}
fclose(fp);
}
return 0;
}
int CFileControl::topget()
{
//
return this->top;
}
#ifndef FILECONTROL_H_
#define FILECONTROL_H_
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string>
using namespace std;
struct UseInfo
{
char FullName[35];
unsigned int HaveMoney;
};
int filecheck(); //꼭대기 파일이 뭔지 리턴.
class CFileControl
{
private:
int top; //현재 데이터의 끝번호
public:
CFileControl(); // top 에다가 마지막 파일 삽입;
~CFileControl();
void dateadd(UseInfo date); //파일 추가.
void datedel(char* number); // 파일 삭제
void dateedit(char* number, UseInfo date); //파일 수정
void dateview(char* number); // 파일 보여주기
void statusview(); // 현재 상황 표시.
void allview(); // 다 보이주되 10개씩. (아직 구현 안함).
void topview(); // 꼭대기 파일 보여주기.
void fileclear();
int topget(); //꼭대기 번호 리턴; 딱 한번 쓴 일회용.
bool isFull(); // 꽉 찼으면 true;
};
#endif
#include "FileControl.h"
int main()
{
CFileControl havemoney;
UseInfo info;
/************************************************************************/
/*사용자로 부터 정보를 입력받는 변수 */
/************************************************************************/
char select = '\0';
char number[5];
int stringleng;
havemoney.statusview();
while(1)
{
if(select == 'q' || select == 'Q')
break;
cout << "파일 추가 A" << endl;
cout << "파일 삭제 D" << endl;
cout << "수정 하기 E" << endl;
cout << "파일내용 보기 V" << endl;
cout << "전체 보기 G" << endl;
cout << "꼭대기 파일 보기 T" << endl;
cout << "종료하기 Q" << endl;
cout << "파일청소하기 C" << endl;
cin >> select;
// 메뉴에 있는 것이아니라 다른 것을 입력했을 경우.
if(!(select == 'A' || select == 'D' || select == 'E' || select == 'V' ||
select == 'a' || select == 'd' || select == 'e' || select == 'v' || select == 'G' ||
select == 'g' || select == 'q' || select == 'Q' || select == 't' || select == 'T' ||
select == 'C' || select == 'c'))
{
cout << "메뉴 똑바로 입력하세요." << endl;
continue;
}
//똑바로 입력하면.
switch(select)
{
case 'A':
case 'a':
ADD1:
//정보가 가득 차지 않았다면.
if(!(havemoney.isFull()))
{
cout << "이름(Full) : ";
cin >> info.FullName;
if((strlen(info.FullName)) > 34)
{
cout << "이름 너무 깁니다. 다시 입력하세요." << endl;
goto ADD1; //이름 입력 다시 하라고...
}
ADD2:
cout << "가지고 있는 돈(원) : ";
char* HaveMoney = new char[11];
cin >> HaveMoney; //가진 돈 받고
stringleng = strlen(HaveMoney); //stringleng 에다가 길이 저장.
//문자열 길이 만큼 검색해서 하나라도 숫자가 아니면... isleng > 0
int isleng = 0;
for(int i=0; i<stringleng; i++)
{
if(!(isdigit(*(HaveMoney + i))))
{
isleng = 1;
break;
}
}
if(isleng == 0) // 숫자라면...
{
if(!(strlen(HaveMoney) > 9)) //2단계 검사. //길이가 넘어가지 않는다면...
{
info.HaveMoney = atoi(HaveMoney);
delete [] HaveMoney;
}
else //2단계 검사를 만족 하지 못하면.
{
cout << "숫자의 크기가 너무 큽니다. ^^\n";
//delete [] HaveMoney;
goto ADD2;
}
}
else //숫자가 아닌게 있다면
{
cout << "숫자를 입력해주세요." << endl;
if(stringleng < 10) //길이가 길지 않으면 delete [] HaveMoney;
delete [] HaveMoney;
goto ADD2; //다시 입력!
}
havemoney.dateadd(info); //데이터 추가 함수 호출.
havemoney.statusview(); //현재 상황 표시.
break;
}
else
{
cout << "1000개 꽉찼습니다." << endl; // 정보가 가득 찼으면.
break;
}
case 'D':
case 'd':
//DEL1:
cout << "몇 번째 파일을 삭제하실 건가요? : ";
cin >> number;
havemoney.datedel(number); //파일 삭제 함수 호출.
havemoney.statusview(); // 현재 상황 호출.
break;
case 'e':
case 'E':
EDIT1: //다시 입력...
cout << "수정 할 파일 : ";
cin >> number;
if(!( isdigit(number[0]) || isdigit(number[1]) || isdigit(number[2]) ||
isdigit(number[3]) || isdigit(number[4]) ) )
{
cout << "숫자를 입력해주십시오." << endl;
goto EDIT1;
}
else if(havemoney.topget() < atoi(number) || 0 >= havemoney.topget())
{
cout << "그런 파일은 없습니다. 다시 입력해주세요." << endl;
goto EDIT1;
}
EDIT2:
cout << "이름 입력 : ";
cin >> info.FullName;
if((strlen(info.FullName)) > 34) //이름이 34자가 넘어간다면.
{
cout << "이름 너무 깁니다. 다시 입력하세요." << endl;
goto EDIT2; //다시 입력하라고.
}
EDIT3:
cout << "가지고 있는 돈 입력 : ";
cin >> number;
if(!( isdigit(number[0]) || isdigit(number[1]) || isdigit(number[2]) ||
isdigit(number[3]) || isdigit(number[4]) ) )
{
cout << "숫자를 입력해주십시오." << endl;
goto EDIT3;
}
info.HaveMoney = atoi(number);
havemoney.dateedit(number, info);
break;
case 'v':
case 'V':
VIEW1:
cout << "보실 정보의 번호 : ";
cin >> number;
if(!( isdigit(number[0]) || isdigit(number[1]) || isdigit(number[2]) ||
isdigit(number[3]) || isdigit(number[4]) ) )
{
cout << "숫자를 입력해주십시오." << endl;
goto VIEW1;
}
havemoney.dateview(number); // 파일 보기 함수 호출.
break;
case 'G':
case 'g':
havemoney.allview(); //모두 보기.
break;
case 'q':
case 'Q':
//종료.
break;
cout << endl;
case 't':
case 'T':
havemoney.topview(); // 꼭대기 파일 보기.
break;
case 'c':
case 'C':
havemoney.fileclear(); // 다 삭제.
break;
}
}
stringleng = 0;
cout << "Good Bye~!" << endl;
while(!(stringleng==200000000))
{
stringleng++;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment