카테고리 없음

파일구조3번째숙제2

comfun 2009. 5. 12. 10:54
반응형

#include <iostream>
#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;
}

 
 

반응형