파일처리 실습 #3

학번 : 20021558	성명 : 경규성

1. 소스코드

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

const int MAXSIZE = 10;

class StudentRecord

{

private:

int	sno;

string	sname;

float	score;

public:

StudentRecord() {;}

StudentRecord(int no, string name, float s) {sno=no, sname=name, score=s;}

void setSno(int no) {sno = no;}

void setSname(string name) {sname = name;}

void setScore(float s) {score = s;}

int getSno() const {return sno;}

string getSname() const {return sname;}

float getScore() const {return score;}

void readFromFile(ifstream&);

void writeToFile(ofstream&);

void printRecord(ostream&);

};

void StudentRecord::writeToFile(ofstream& BinOut)	// 이진파일에 쓰기

{

// 채워야 할 부분

int namelen = (int)sname.length();

BinOut.write((char*) &sno, sizeof(int));

BinOut.write((char*) &namelen, sizeof(int));

BinOut.write(sname.c_str(), (std::streamsize)namelen);

BinOut.write((char*) &score, sizeof(float));

}

void StudentRecord::readFromFile(ifstream& Bin)	// 이진파일 읽기

{

// 채워야 할 부분

int len;

char* name = new char[20];

Bin.read((char*) &sno, sizeof(int));

Bin.read((char*) &len, sizeof(int));

Bin.read((char*) name, (std::streamsize)len);

name[len] = '\0';

sname = name;

Bin.read((char*) &score, sizeof(float));

}

void StudentRecord::printRecord(ostream&)	// 화면에 출력

{

// 채워야 할 부분

cout << sno <<'\t'<< sname <<'\t'<< score <<endl;

}

int main()

{

StudentRecord S[MAXSIZE], R[MAXSIZE];

string sname;

int	sno;

float score;

ifstream TextIn("student.txt", ios::in);	// student 파일 오픈

int i=0, n=0;  // 루프 변수

// student 파일에서 레코드 읽어 배열에 저장

while (TextIn.good() && TextIn.peek() != EOF)

{

TextIn >> sno >> sname >> score;

TextIn.ignore(300, '\n');

S[i].setSno(sno);

S[i].setSname(sname);

S[i].setScore(score);

i++;

}

int numOfStudents = i;  // 읽어 들인 학생 수

TextIn.close();

for (n=0; n<numOfStudents; n++) // 읽어 들인 학생 레코드를 콘솔에 출력

S[n].printRecord(cout);

cout << endl;

ofstream BinOut("student.bin", ios::out | ios::trunc | ios::binary);

// 배열에 저장된 학생 레코드를 이진 파일에 저장

for (n=0; n<numOfStudents; n++)

S[n].writeToFile(BinOut); // 파일에쓰기

BinOut.close();

// 채워야 할 부분

// 이진 파일에 저장된 학생 레코드를 오픈하고 레코드를 읽어 콘솔에 출력

ifstream Bin("student.bin");

for(n=0; n<numOfStudents; n++)	// 파일에서읽기

R[n].readFromFile(Bin);

cout << "이진파일에서 읽은 데이터" << endl;

for (n=0; n<numOfStudents; n++) // 읽어 들인 학생 레코드를 콘솔에 출력

R[n].printRecord(cout);

cout << endl;

return 0;

}

2. 실행화면