home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Black Box 4
/
BlackBox.cdr
/
progc
/
snip1091.arj
/
STRUCFIL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-05
|
5KB
|
184 lines
/*******************************************************************
* Generic structure <> disk file manipulations. These functions
* form a basic template for reading and writing structures to a
* sequential file. This template is probably most useful for files
* with 500 or less records and eliminates the need for a more
* elaborate file handler such as C-Tree, DB-Vista, Mix etc.
* Routines to put data in the struct is out of scope here.
* Written by Lynn Nash 8/28/91 and donated to the public domain.
*/
#include <io.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#ifndef ERROR
#define ERROR -1
#define OK 0
#endif
#ifndef TRUE
#define TRUE 1
#define FALSE !TRUE
#endif
/* make sure the record structure is byte aligned */
#pragma pack(1)
static struct blackbook {
int delete_flag; /* 0 = active -1 = deleted */
int recordnum; /* a sequential number in the file */
/* The data fields in asciiz. */
char firstname[11];
char lastname[16];
char addr[26];
char city[16];
char state[3];
char zip[10];
char phone[11];
} rec, oldrec; /* 97 byte record * 2 */
#pragma pack()
/*-------------------- general globals ---------------------*/
static long cur_rec = 0; /* the current record number */
static FILE *fsptr = NULL; /* fixed record data file pointer */
/* if file exists open in read/write mode else create file */
FILE * open_file(char *filename)
{
if (access(filename, 0) == 0)
fsptr = fopen(filename, "rb+");
else fsptr = fopen(filename, "wb+");
return fsptr; /* return the file pointer */
}
/* add new records to the data file */
int datadd(void)
{
if (fsptr)
{
if (fseek(fsptr, 0L, SEEK_END) != 0)
return ERROR; /* seek failure */
rec.delete_flag = 0; /* active record tag */
rec.recordnum = (int) (ftell(fsptr) /
(long) sizeof(struct blackbook));
if (fwrite(&rec, sizeof(struct blackbook), 1, fsptr) != 1)
{
return ERROR; /* write error */
}
else
{
/* put your clean up code here */
return OK;
}
}
return ERROR;
}
/* tag the last record read in the file as deleted */
int data_delete(void)
{
if (fsptr)
{
if (fseek(fsptr, (long) sizeof(struct blackbook) * -1L,
SEEK_CUR) != 0)
{
return ERROR;
}
rec.delete_flag = -1; /* tag the record as deleted */
if (fwrite(&rec, sizeof(struct blackbook), 1, fsptr) != 1)
return ERROR;
else return OK;
}
return ERROR;
}
/* read a random structure. If successful the global cur_rec will
* contain the number of the last record read & it can be compared
* to the number in the struct as a double check (belt & suspenders)
*/
int data_read(long recnum)
{
if (fseek(fsptr, (long) sizeof(struct blackbook) * recnum,
SEEK_SET) != 0)
{
return ERROR;
}
cur_rec = recnum; /* keep tabs on record pointer in global */
/* now read the record into save struct*/
if (fread(&oldrec, sizeof(struct blackbook), 1, fsptr) != 1)
{
return ERROR;
}
else /* copy save struct to edit struct */
{
memcpy(&rec, &oldrec, sizeof(struct blackbook));
return OK;
}
}
/* rewrite the last read record back to disk */
int data_update(void)
{
if (memcmp(&rec, &oldrec, sizeof(struct blackbook)) == 0)
return TRUE; /* no update needed */
/* back up one record before writing */
if (fseek(fsptr, (long) sizeof(struct blackbook) * -1L,
SEEK_CUR) != 0)
{
return ERROR; /* seek error */
}
/* now write the record */
if (fwrite(&rec, sizeof(struct blackbook), 1, fsptr) != 1)
return ERROR; /* write error */
return OK;
}
/* get the next valid record in the file */
int read_forward(void)
{
do
{
cur_rec++; /* upcount the record number */
if (data_read(cur_rec) != 0)
{
cur_rec--; /* decrement the record number */
return ERROR;
}
} while (oldrec.delete_flag != 0); /* record read was deleted */
return OK;
}
/* get the previous valid record in the file */
int read_backward(void)
{
do
{
cur_rec--; /* decrement the record number */
if (cur_rec >= 0)
{
if ( data_read(cur_rec) != 0 )
{
cur_rec++; /* increment the record number */
return ERROR;
}
}
} while (oldrec.delete_flag != 0); /* record read was deleted */
return OK;
}