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水木清华站∶精华区