#include <String>
#include <fstream>
using namespace std;
class FixedRecordFile
{
public :
int NumRecs();
void ReadByRRN(string &record, int RRN);
// 키정렬을 위해 필요한 추가적인 메소드
void Create(char *filename);
void Append(string &record);
char *fileName;
};
int FixedRecordFile::NumRecs()
{
fstream file;
file.open("in.txt", ios::in);
char buf[200];
int number = 0;
while(1)
{
if(file.fail())
break;
file.getline(buf, 63);
number++;
}
file.close();
return number-1;
}
void FixedRecordFile::ReadByRRN(string &record, int RRN)
{
fstream file;
file.open("in.txt", ios::in);
char buf[200];
string a;
file.seekg(64*RRN, ios::beg);
file.getline(buf, 63);
file.close();
record = buf;
}
void FixedRecordFile::Append(string &record)
{
fstream file;
file.open(fileName, ios::out|ios::app);
file << record;
file << "\n";
file.close();
}
void FixedRecordFile::Create(char *filename)
{
fileName = filename;
fstream file;
file.open(filename, ios::out);
file.close();
}
class KeyRRN
// (KEY, RRN)의 쌍을 포함한다
{
public :
string KEY; int RRN;
KeyRRN();
KeyRRN(string key, int rrn);
};
KeyRRN::KeyRRN()
{
this->KEY = "0";
this->RRN = 0;
}
KeyRRN::KeyRRN(string key, int rrn)
{
this->KEY = key;
this->RRN = rrn;
}
void Sort(KeyRRN KEYNODES[], int numKeys)
{
for(int i=numKeys-1;i>=1;i--)
{
for(int j=0;j<i;j++)
{
if((KEYNODES[j].KEY.compare(KEYNODES[j+1].KEY))>0)
{
string temp = KEYNODES[j+1].KEY;
KEYNODES[j+1].KEY = KEYNODES[j].KEY;
KEYNODES[j].KEY = temp;
int tempRRN = KEYNODES[j+1].RRN;
KEYNODES[j+1].RRN = KEYNODES[j].RRN;
KEYNODES[j].RRN = tempRRN;
}
}
}
}
int KeySort(FixedRecordFile &inFile, char *outFileName)
{
string obj;
KeyRRN *KEYNODES = new KeyRRN[inFile.NumRecs()];
// 화일을 읽어서 키를 적재
for(int i=0; i<inFile.NumRecs(); i++)
{
inFile.ReadByRRN(obj, i); // 레코드 I를 읽는다
KEYNODES[i] = KeyRRN(obj.substr(2, 15), i); // 키와 RRN을 키 배열에 넣는다
}
Sort(KEYNODES, inFile.NumRecs()); // 키 배열을 정렬한다
for(i=0; i<inFile.NumRecs(); i++)
{
cout << "keynodes[" << i << "].key, .rrn = " << KEYNODES[i].KEY << ", " << KEYNODES[i].RRN << endl;
}
FixedRecordFile outFile; // 정렬된 키순서로 레코드를 지니게 될 화일
outFile.Create(outFileName); // 새로운 화일을 생성한다
// 정렬된 키 순서로 새로운 화일에 기록한다
for(int j=0; j<inFile.NumRecs(); j++)
{
inFile.ReadByRRN(obj, KEYNODES[j].RRN); // 키 순서로 읽기
outFile.Append(obj); // 키순서로 기록
}
return 1;
}
int main()
{
FixedRecordFile b;
KeySort(b, "out.txt");
return 0;
}