Last active
September 18, 2017 03:24
-
-
Save hsnks100/6306e95a06e70d7448659e7545ac201d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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