BBS水木清华站∶精华区
发信人: xcec (money), 信区: Linux
标 题: guest-->datafile.h, datafile.cpp
发信站: BBS 水木清华站 (Mon Jan 17 13:06:50 2000) WWW-POST
//datafile.h
#ifndef DATAFILE_H
#define DATAFILE_H
#define MAX_ENTRY 1000
#define INDEX_FILE "index"
#define DATA_FILE "data"
#define NAME_LENGTH 10
#define MAIL_LENGTH 20
#define HOMEPAGE_LENGTH 30
#define TITLE_LENGTH 100
#define CONTENT_LENGTH 2000
#define IP_LENGTH 16
#define TIME_LENGTH 30
struct GUEST {
char name[NAME_LENGTH];
char mail[MAIL_LENGTH];
char homepage[HOMEPAGE_LENGTH];
char title[TITLE_LENGTH];
char content[CONTENT_LENGTH];
char ip[IP_LENGTH];
char time[TIME_LENGTH];
};
class DATAFILE {
int tail;
int add[MAX_ENTRY];
int link[MAX_ENTRY];
public:
DATAFILE();
~DATAFILE();
GUEST *read(GUEST *, int);
GUEST *write(GUEST *);
int del_record(int);
int get_record_num(void);
};
#endif
//datafile.cpp
#include <stdio.h>
#include "datafile.h"
DATAFILE::DATAFILE()
{
FILE *file;
if ( !(file = fopen(INDEX_FILE, "rb")) ) {
tail = 0;
for (int i = 0; i < MAX_ENTRY; i++) {
add[i] = -1;
link[i] = 0;
}
}
else {
fread(this, sizeof(DATAFILE), 1, file);
fclose(file);
}
}
DATAFILE::~DATAFILE()
{
FILE *file;
file = fopen(INDEX_FILE, "wb");
fwrite(this, sizeof(DATAFILE), 1, file);
fclose(file);
}
GUEST *DATAFILE::read(GUEST *guest, int n)
{
if (n <= 0 || n > tail)
return NULL;
FILE *file;
if ( !(file = fopen(DATA_FILE, "rb")) )
return NULL;
int size = sizeof(GUEST);
fseek(file, add[n-1]*size, 0);
fread(guest, size, 1, file);
fclose(file);
return guest;
}
GUEST *DATAFILE::write(GUEST *guest)
{
if (tail >= MAX_ENTRY)
return NULL;
int i = 0;
while (link[i])
++i;
link[i] = 1;
add[tail++] = i;
FILE *file;
if ( !(file = fopen(DATA_FILE, "r+b")) ) {
file = fopen(DATA_FILE, "ab");
fclose(file);
file = fopen(DATA_FILE, "r+b");
}
fseek(file, i*sizeof(GUEST), 0);
fwrite(guest, sizeof(GUEST), 1, file);
fclose(file);
return guest;
}
int DATAFILE::del_record(int n)
{
if (n < 1 || n > tail)
return 0;
link[add[n-1]] = 0;
int i = n-1;
while (i < tail - 1) {
add[i] = add[i + 1];
i++;
}
add[--tail] = -1;
return n;
}
int DATAFILE::get_record_num(void)
{
return tail;
}
--
※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.33.162]
BBS水木清华站∶精华区