// rw.h
#ifndef rrrrrrrrrrrrrr
#define rrrrrrrrrrrrrr
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define version 1.0.0
#define OFFSET16bit(x) ( (x + 15) >> 4 << 4 )
class OBJ{
public:
char ID[32];
char score[8];
char name[32];
char HomeAddress[128];
};
void WriteOBJ(FILE* pf, OBJ object);
void ReadObj(FILE* pf, OBJ &obj, int idx);
#endif
// read.cpp
#include "rw.h"
void ReadObj(FILE* pf, OBJ &obj, int idx)
{
fflush(pf);
fseek(pf, 0, SEEK_END);
int sz = ftell(pf);
const int HeadSize = 100;
int objsz = sizeof(OBJ);
int cnt = 0;
/*
class OBJ{
public:
char ID[32];
char score[8];
char name[32];
char HomeAddress[128];
};
*/
long objoffset = HeadSize + idx*objsz;
fseek(pf, objoffset , SEEK_SET);
int idsz = 0, scoresz = 0, namesz = 0, hasz = 0;
fread(&idsz, sizeof(int), 1, pf);
fread(&scoresz, sizeof(int), 1, pf);
fread(&namesz, sizeof(int), 1, pf);
fread(&hasz, sizeof(int), 1, pf);
objoffset += 4 * sizeof(int);
fread(obj.ID, idsz, 1, pf);
objoffset += sizeof(obj.ID);
fseek(pf, objoffset, SEEK_SET);
fread(obj.score, scoresz, 1, pf);
objoffset += sizeof(obj.score);
fseek(pf, objoffset, SEEK_SET);
fread(obj.name, namesz, 1, pf);
objoffset += sizeof(obj.name);
fseek(pf, objoffset, SEEK_SET);
fread(obj.HomeAddress, hasz, 1, pf);
fflush(pf);
}
// write.cpp
#include "rw.h"
void WriteOBJ(FILE* pf, OBJ object)
{
fflush(pf);
fseek(pf, 0, SEEK_END);
int sz = ftell(pf);
const int HeadSize = 100;
int objsz = sizeof(OBJ);
int cnt = 0;
if (sz == 0)
{
fseek(pf, 0, SEEK_SET);
printf("new file create\n");
char VersionInfo[64] = "JSSJ Indexing Module Version 1.0.0";
int len = strlen(VersionInfo) + 1;
fwrite(&len, sizeof(len), 1, pf);
fwrite(VersionInfo, strlen(VersionInfo), 1, pf);
fwrite("\0", 1, 1, pf);
fseek(pf, 80, SEEK_SET);
fwrite(&cnt, sizeof(cnt), 1, pf);
fflush(pf);
}
fseek(pf, 80, SEEK_SET);
fread(&cnt, sizeof(cnt), 1, pf);
fflush(pf);
/*
class OBJ{
public:
char ID[32];
char score[8];
char name[32];
char HomeAddress[128];
};
*/
long curoffset = HeadSize + cnt * objsz;
fseek(pf, curoffset, SEEK_SET);
int IDlen = strlen(object.ID) + 1;
int scoreLen = strlen(object.score) + 1;
int nameLen = strlen(object.name) + 1;
int homeAdressLen = strlen(object.HomeAddress) + 1;
fwrite(&IDlen, sizeof(int), 1, pf);
fwrite(&scoreLen, sizeof(int), 1, pf);
fwrite(&nameLen, sizeof(int), 1, pf);
fwrite(&homeAdressLen, sizeof(int), 1, pf);
fwrite(object.ID, strlen(object.ID), 1, pf);
fwrite("\0", 1, 1, pf);
long of = curoffset + 4 * sizeof(int) + sizeof(object.ID);
fseek(pf, of, SEEK_SET);
fwrite(object.score, strlen(object.score), 1, pf);
fwrite("\0", 1, 1, pf);
of = of + sizeof(object.score);
fseek(pf, of, SEEK_SET);
fwrite(object.name, strlen(object.name), 1, pf);
fwrite("\0", 1, 1, pf);
of = of + sizeof(object.name);
fseek(pf, of, SEEK_SET);
fwrite(object.HomeAddress, strlen(object.HomeAddress), 1, pf);
fwrite("\0", 1, 1, pf);
cnt++;
fseek(pf, 80, SEEK_SET);
fwrite(&cnt, sizeof(cnt), 1, pf);
fflush(pf);
}
// test.cpp
#include "rw.h"
#include <iostream>
using namespace std;
int main()
{
FILE *pf;
pf = fopen("./Index.dat", "w+");
OBJ obj1, obj2, obj3;
strcpy(obj1.ID,"sy0915120");
strcpy(obj1.score, "80");
strcpy(obj1.name, "tangzesheng");
strcpy(obj1.HomeAddress, "JiangxiJiujiang");
strcpy(obj2.ID, "sy0915125");
strcpy(obj2.score, "90");
strcpy(obj2.name, "xushenghui");
strcpy(obj2.HomeAddress, "HubeiXiantao");
strcpy(obj3.ID, "sy0915214");
strcpy(obj3.score, "79");
strcpy(obj3.name, "wangshuang");
strcpy(obj3.HomeAddress, "henan");
WriteOBJ( pf, obj1);
WriteOBJ( pf, obj2);
WriteOBJ( pf, obj3);
OBJ obj4;
ReadObj(pf, obj4, 1);
cout << "ID: "
<< obj4.ID
<< endl
<< "Score: "
<< obj4.score
<<endl
<< "Name: "
<< obj4.name
<< endl
<< "Address: "
<< obj4.HomeAddress
<< endl;
fclose(pf);
return 0;
}