C++ file pointer 연습
힙(Heap) 메모리에 임의의 외부 파일에 저장되어 있는 2차원 배열 데이터를 저장할 수 있는 동적 메모리를 생성하고, 최소값과 최대값 그리고 각각의 행의 평균을 계산하는 프로그램을 작성해 보자. 2차원 데이터는 파일로부터 읽는다. 처음 두 개의 요소들은 배열의 행 과 열의 수를 나타낸다. 파일 데이터는 아래와 같다. 아래의 2차원 배열은 12 X 8 배열이다.
------------------------------------------
8 12
638 758 113 515 51 627 10 41 9 212 86 749
767 84 60 225 54 3 89 183 137 566 966 979
495 31 1 387 54 31 145 882 736 524 50 5
394 102 851 57 754 553 561 9 8 628 188 85
43 957 406 165 40 3 562 834 343 950 444 803
953 21 8 753 548 484 21 848 231 234 87 8
448 979 721 315 875 342 587 89 4 942 37 987
351 321 897 8 64 334 90 73 48 95 79 12
------------------------------------------
1. 문제에서 주어진 2차원 데이터 배열을 (배열의 행과 열 정보도 같이)메모장 등의 텍스트 편집기를 이용하여 임의의 이름으로 파일을 저장(예 test.txt)하고, File 입출력 함수를 통하여 test.txt에 저장되어 있는 배열 정보와 데이터를 정확하게 읽고 출력 해보는 프로그램을 작성한다. (동적으로 배열을 할당 시 2차원 배열을 1차원 배열로 할당해도 상관없음)
2. 각 행의 평균과 전체 데이터의 최소값, 최대값을 계산하고, 출력하는 프로그램을 추가하여 프로그램을 완성한다.
01: #include <iostream> 02: #include <fstream> 03: using namespace std; 04: 05: void main( ) 06: { 07: char array1[9]={0,}, array2[9]={0,}; //data.txt 파일 첫 라인에 있는 array1,2 를 구하기 위한 char[] 08: int x,y,countx=0,county=0; // [x][y] (countx,couny x,y를 구하기 위함) 09: bool space=false;//(countx,couny x,y를 구하기 위함) 10: int count1=0,count3=0; //카운트를 세기 위한 변수 11: char temp[9]={0,}, ch; //data.txt에서 추출한 수가 임시로 들어가있을 장소 12: 13: ifstream fin("data.txt"); //data.txt 파일을 읽는다. 14: if (fin.is_open()) //파일이 열렸다면 15: cout<<"File open success.\n\n"; 16: else 17: cout<<"File open fail.\n\n"; 18: 19: // char recs[array_size]; // 문자배열선언 1000개 20: 21: char sizetemp[9]; //data.txt파일의 첫번째 줄 을 읽기 위한 임시 저장소 22: fin.getline(sizetemp,9,'\n'); //data.txt 파일의 첫 라인을 읽고 sizetemp에 저장하한다. 23: 24: //---1--------------------------------------// 25: for (int a1=0; a1<9; a1++){ 26: if(sizetemp[a1]==NULL) 27: break; 28: if(sizetemp[a1]==' '){ 29: space=true; 30: continue; 31: } 32: if (!space){ 33: array1[countx]=sizetemp[a1]; 34: countx++; 35: } 36: if (space){ 37: array2[county]=sizetemp[a1]; 38: county++; 39: } 40: } 41: x=atoi(array1); 42: y=atoi(array2); 43: int* data=(int *)malloc(sizeof(int)*x*y); //data[x][y] 에 읽은 내용이 들어갈것임 44: cout<< x<<'*'<<y<<endl; 45: //---1 : 배열 크기 할당 ---------------------// 46: 47: while(!fin.eof()){ 48: fin.get(ch); // 한글자씩 읽어들인다. 49: if (!isspace(ch)) //만일 공백이 아니라면 50: temp[count1++]=ch; //임시 char에 넣어 둔다. 51: else{ //공백이 발생하면 52: count1=0; //temp에 새로운 데이터를 넣어야 하니까 카운트를 0으로 잡고 53: data[count3++]=atoi(temp); //그리고 동적 할당한 배열에 넣고 54: for (int count2=0;count2<9;count2++) //temp를 초기화 한다. 55: temp[count2]=0; 56: } 57: } 58: fin.close(); //파일 닫기 59: 60: for(count1=0; count1<x*y ; count1++){//읽어들인 자료 화면에 출력 61: if (count1%y==0) 62: cout<<endl; 63: cout << data[count1]<< ' '; 64: } 65: cout << endl; 66: 67: count1=1; 68: int ttemp=0, min=data[0],max=data[0]; //계산을 위한 임시 변수 69: for(int j=1; j<=x*y ; j++){ //계산하기 위하여 돌린다. 70: if (data[j-1]<min) 71: min=data[j-1]; 72: if(data[j-1]>max) 73: max=data[j-1]; 74: ttemp+=data[j-1]; 75: if (j%y==0){ 76: cout<<count1++<<"행 합 :"<<ttemp<<"평균 :"<<ttemp/y<<endl; 77: ttemp=0; 78: } 79: } 80: cout<<"최소값 : "<<min<<" 최대값 : "<<max<<endl; 81: } 82: /*--------------------data.txt----------------------// 83: 8 12 84: 638 758 113 515 51 627 10 41 9 212 86 749 85: 767 84 60 225 54 3 89 183 137 566 966 979 86: 495 31 1 387 54 31 145 882 736 524 50 5 87: 394 102 851 57 754 553 561 9 8 628 188 85 88: 43 957 406 165 40 3 562 834 343 950 444 803 89: 953 21 8 753 548 484 21 848 231 234 87 8 90: 448 979 721 315 875 342 587 89 4 942 37 987 91: 351 321 897 8 64 334 90 73 48 95 79 12 92: //--------------------data.txt----------------------*/
'C & C++ 관련' 카테고리의 다른 글
File Copy LowLevel (0) | 2007.03.28 |
---|---|
socket을 옳바르게 닫기 (0) | 2007.03.26 |
Socket Programing 기본 함수 (0) | 2007.03.26 |