-
#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 exchange(StudentRecord &x, StudentRecord &y)
{
StudentRecord tmp = x;
x = y;
y = tmp;
}void bubble(StudentRecord a[], int n)
{
for (int i = 0; i < n - 1; i++)
for (int j = n - 1; j > i; j--)
if (a[j-1].getSname() > a[j].getSname())
exchange(a[j-1], a[j]);
}
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], Odd[MAXSIZE], Even[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;bubble(S , numOfStudents);
ofstream BinOutOdd("studentOdd.bin", ios::out | ios::trunc | ios::binary);
ofstream BinOutEven("studentEven.bin", ios::out | ios::trunc | ios::binary);int odd=0 , even=0;
for(int j=0; j<numOfStudents; j++)
{
if(j%2 == 0)
{S[j].writeToFile(BinOutOdd); odd++;}
else
{S[j].writeToFile(BinOutEven); even++;}
}//cout << odd << even << endl;
BinOutEven.close();
BinOutOdd.close();
// 채워야 할 부분
// 이진 파일에 저장된 학생 레코드를 오픈하고 레코드를 읽어 콘솔에 출력
ifstream BinOdd("studentOdd.bin");
ifstream BinEven("studentEven.bin");for(n=0; n<odd; n++)// 파일에서읽기
Odd[n].readFromFile(BinOdd);for(n=0; n<even; n++)// 파일에서읽기
Even[n].readFromFile(BinEven);cout << "홀수파일에서 읽은 데이터" << endl;
for (n=0; n<odd; n++) // 읽어 들인 학생 레코드를 콘솔에 출력
Odd[n].printRecord(cout);
cout << endl;cout << "짝수파일에서 읽은 데이터" << endl;
for (n=0; n<even; n++) // 읽어 들인 학생 레코드를 콘솔에 출력
Even[n].printRecord(cout);BinOdd.close();
BinEven.close();return 0;
}