January 23th Friday 2009 (一月 二十三日 金曜日)

来源:互联网 发布:淘宝上的点痣笔有用吗 编辑:程序博客网 时间:2024/04/30 14:11

  This evening I am about to come back to Wuhan.  I have to put up with no sleeping this night.  Sometimes I hate a mass of people in this holiday. Where are they coming from?

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>
#include <time.h>

using namespace std;

#define STR_DATA_MAX 128
class Record {
private:
int rec_no;
int data_size;
char data[STR_DATA_MAX];

public:
Record() {
rec_no = -1;
data_size = 0;
memset(data, 0, sizeof(data));
}

Record(char *strData) {
rec_no = -1;
setDataAsString(strData, strlen(strData));
}

~Record(){}

int getRecNo() { return rec_no; }
void setRecNo(int n) { rec_no = n; }

int getDataSize() { return data_size; }
void setDataSize(int n) { data_size = n; }

char * getDataAsString() { return data; }
void setDataAsString(char *strData, int data_len) {
data_size = data_len;
strncpy(data, strData, data_size);
}
};

class Index {
private:
int rec_no;
int pos;
public:
Index() {
rec_no = -1;
pos = -1;
}

int getRecNo() { return rec_no; }
void setRecNo(int n) { rec_no = n; }
int getPos() { return pos; }
void setPos(int p) { pos = p; }
};


char getRandChar(){
static char str[] = "abcdefghijklmnopqrstuvwxyz";
int j=1+(int)(26.0*rand()/(RAND_MAX+1.0));
if (j > 25) j = 25;
return str[j];
};

int getIndexFileName(char *name, char * index_name) {
char *p = NULL;
char name_len = 0;
memset(index_name, 0, STR_DATA_MAX);
p = strrchr(name, '.');
if (!p) return 0;
p++;
name_len = p - &name[0];
strncpy(index_name, name, name_len);
strncpy(&index_name[name_len], "idx", 3);
return 1;
}

#define RECORD_NUM 100

class DB {
private:
Record record_set[RECORD_NUM];
Index index_set[RECORD_NUM];
ifstream infile;
int record_num;

public:
DB() {
record_num = 0;
srand((int)time(0));

for (int i = 0; i < RECORD_NUM; i++)
record_set[i].setRecNo(-1);
}

~DB() {}

void init() {
char buf[STR_DATA_MAX];

for (int i = 0; i < RECORD_NUM; i++) {
memset(buf, 0, sizeof(buf));
//make a string by rand().
for (int n = 0; n < STR_DATA_MAX - 1; n++)
buf[n] = getRandChar();

record_set[i].setDataAsString(buf, strlen(buf));
}
}

void displayRecordSet() {
for (int i = 0; i < RECORD_NUM; i++){
cout<<i<<": "<<record_set[i].getDataAsString()<<endl;
}
}

void showRecord(int rec_no) {
char *cp = NULL;
if (rec_no >= RECORD_NUM && rec_no < 0) return;

for (int i = 0; i < RECORD_NUM; i++){
if (rec_no == record_set[i].getRecNo())
break;
}

if (i == RECORD_NUM){
i = loadRecord(rec_no);
if (i == -1) return;
}

cp = record_set[i].getDataAsString();
cout<<rec_no<<": "<<cp<<endl;
}

void writeToFile(char *filename) {
char *cp = NULL;
char index_name[STR_DATA_MAX];

//write data
ofstream of(filename, ios::binary | ios::out);
for (int i = 0; i < RECORD_NUM; i++) {

index_set[i].setRecNo(i);
index_set[i].setPos(0);
int pos = of.tellp();
index_set[i].setPos(pos);

record_set[i].setRecNo(i);
int data_size = record_set[i].getDataSize();
cp = record_set[i].getDataAsString();

of.write((char *)&data_size, sizeof(int));
of.write(cp, data_size);
}

//write index
getIndexFileName(filename, index_name);
ofstream oidx(index_name, ios::binary | ios::out);
for (int j = 0; j < RECORD_NUM; j++) {
int r = index_set[j].getRecNo();
int p = index_set[j].getPos();
oidx.write((char *)&r, sizeof(int));
oidx.write((char *)&p, sizeof(int));
}
}

void open(char* db_name){
char index_name[STR_DATA_MAX];
infile.open(db_name);

//load index
getIndexFileName(db_name, index_name);
ifstream indexfile(index_name, ios::binary | ios::in);
for (int i = 0; i < RECORD_NUM; i++) {
int rec_no = 0;
int pos = 0;
indexfile.read((char *)&rec_no, sizeof(int));
indexfile.read((char *)&pos, sizeof(int));
index_set[i].setRecNo(rec_no);
index_set[i].setPos(pos);
}
}

void close(){
infile.close();
}

int loadRecord(int rec_no) {
int len = 0;
char buf[STR_DATA_MAX];

memset(buf, 0, sizeof(buf));

record_set[record_num].setRecNo(rec_no);

infile.seekg(index_set[record_num].getPos(), ios::beg);
infile.read((char *)&len, sizeof(int));
infile.read(buf, len);

record_set[record_num].setDataSize(len);
record_set[record_num].setDataAsString(buf, len);
record_num++;

return record_num - 1;
}
};

int main() {
DB db;
//db.init();
//db.displayRecordSet();
//db.writeToFile("./test.db");

db.open("./test.db");
db.showRecord(99);
db.close();

return 0;
}