#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define DELETED_RECORD '*'
#define USABLE_RECORD ' '
#define NUMERIC_FIELD 'N'
#define CHARACTER_FIELD 'C'
#define LOGICAL_FIELD 'L'
#define MEMO_FIELD 'M'
#define DATE_FIELD 'D'
#define FLOAT_FIELD 'F'
#define PICTURE_FIELD 'P'
#pragma pack(1)
typedef struct {
unsigned int bfVersion:7;
unsigned int bfHasMemo:1;
unsigned int bYear:8;
unsigned char bMonth;
unsigned char bDay;
long int lNumberRecords;
short int nFirstRecordOffset;
short int nRecordLength;
unsigned char szReserved[20];
} DB3HEADER;
typedef struct {
char szColumnName[11];
char chType;
long lFieldPointer;
unsigned char byLength;
unsigned char byDecimalPlace;
char szReserved[14];
} COLUMNDEF;
int main()
{
FILE *DBFile;
DB3HEADER db3Header;
struct _DBRECORD {
char sStatus[1];
char sName[40];
char sAddr1[40];
char sAddr2[40];
char sCity[20];
char sState[2];
char sZip[5];
} OurRecord;
char *pOurRecord;
COLUMNDEF ColumnDef[6];
char szBuffer[200];
char szTime[26];
char szFileName[25];
int i;
int nColumnCount = 0;
int nResult;
long lCurrentRecord = 0;
double dSales = 0.0;
struct tm *NewTime;
time_t aClock;
printf("Please enter new database name: ");
gets(szFileName);
DBFile = fopen(szFileName, "wb");
if (DBFile == NULL)
{
fprintf(stderr,
"ERROR: File '%s' couldn't be opened.\n", szFileName);
exit(4);
}
time( &aClock );
NewTime = localtime(&aClock);
memset(&db3Header, 0, sizeof(db3Header));
db3Header.bfVersion = 3;
db3Header.bfHasMemo = 0;
db3Header.bYear = NewTime->tm_year;
db3Header.bMonth = (unsigned char)(NewTime->tm_mon + 1);
db3Header.bDay = (unsigned char)NewTime->tm_mday;
db3Header.lNumberRecords = 0;
db3Header.nFirstRecordOffset = sizeof(DB3HEADER) + sizeof(ColumnDef)
+ 2;
db3Header.nRecordLength = sizeof(OurRecord);
nResult = fwrite((char *)&db3Header,
sizeof(DB3HEADER),
1,
DBFile);
if (nResult != 1)
{
fprintf(stderr, "ERROR: File '%s', write error (Database \
header).\n",
szFileName);
fclose(DBFile);
exit(4);
}
memset(ColumnDef, 0, sizeof(ColumnDef));
strcpy(ColumnDef[0].szColumnName, "Name");
ColumnDef[0].chType = CHARACTER_FIELD;
ColumnDef[0].byLength = sizeof(OurRecord.sName);
ColumnDef[0].byDecimalPlace = 0;
strcpy(ColumnDef[1].szColumnName, "Address1");
ColumnDef[1].chType = CHARACTER_FIELD;
ColumnDef[1].byLength = sizeof(OurRecord.sAddr1);
ColumnDef[1].byDecimalPlace = 0;
strcpy(ColumnDef[2].szColumnName, "Address2");
ColumnDef[2].chType = CHARACTER_FIELD;
ColumnDef[2].byLength = sizeof(OurRecord.sAddr2);
ColumnDef[2].byDecimalPlace = 0;
strcpy(ColumnDef[3].szColumnName, "City");
ColumnDef[3].chType = CHARACTER_FIELD;
ColumnDef[3].byLength = sizeof(OurRecord.sCity);
ColumnDef[3].byDecimalPlace = 0;
strcpy(ColumnDef[4].szColumnName, "State");
ColumnDef[4].chType = CHARACTER_FIELD;
ColumnDef[4].byLength = sizeof(OurRecord.sState);
ColumnDef[4].byDecimalPlace = 0;
strcpy(ColumnDef[5].szColumnName, "Zipcode");
ColumnDef[5].chType = CHARACTER_FIELD;
ColumnDef[5].byLength = sizeof(OurRecord.sZip);
ColumnDef[5].byDecimalPlace = 0;
nResult = fwrite((char *)ColumnDef,
sizeof(ColumnDef),
1,
DBFile);
if (nResult != 1)
{
fprintf(stderr, "ERROR: File '%s', write error (Column \
headers).\n",
szFileName);
fclose(DBFile);
exit(4);
}
nResult = fwrite((char *)"\x0D\0",
sizeof(char) * 2,
1,
DBFile);
if (nResult != 1)
{
fprintf(stderr, "ERROR: File '%s', write error (Column \
headers).\n",
szFileName);
fclose(DBFile);
exit(4);
}
db3Header.nFirstRecordOffset = (int)ftell(DBFile);
/* Step 5. Get some records for the database. */
memset(&OurRecord, 0, sizeof(OurRecord));
printf("Enter the name: (or no name to end)");
gets(szBuffer);
strncpy(OurRecord.sName, szBuffer, sizeof(OurRecord.sName));
while (strlen(szBuffer) > 0)
{
OurRecord.sStatus[0] = USABLE_RECORD;
printf("Enter address line 1: ");
gets(szBuffer);
strncpy(OurRecord.sAddr1, szBuffer, sizeof(OurRecord.sAddr1));
printf("Enter address line 2:");
gets(szBuffer);
strncpy(OurRecord.sAddr2, szBuffer, sizeof(OurRecord.sAddr2));
printf("Enter city:");
gets(szBuffer);
strncpy(OurRecord.sCity, szBuffer, sizeof(OurRecord.sCity));
printf("Enter state (2 characters only):");
gets(szBuffer);
strncpy(OurRecord.sState, szBuffer, sizeof(OurRecord.sState));
printf("Enter Zipcode:");
gets(szBuffer);
strncpy(OurRecord.sZip, szBuffer, sizeof(OurRecord.sZip));
pOurRecord = (char *)&OurRecord;
for (i = 0; i < sizeof(OurRecord); i++)
{
if (pOurRecord[i] == '\0')
{
pOurRecord[i] = ' ';
}
}
nResult = fwrite((char *)&OurRecord,
sizeof(OurRecord),
1,
DBFile);
if (nResult != 1)
{
fprintf(stderr, "ERROR: File '%s', write error (Column \
headers).\n",
szFileName);
fclose(DBFile);
exit(4);
}
else
{
++db3Header.lNumberRecords;
}
memset(&OurRecord, 0, sizeof(OurRecord));
printf("Enter the name: (or no name to end)");
gets(szBuffer);
strncpy(OurRecord.sName, szBuffer, sizeof(OurRecord.sName));
}
time( &aClock );
NewTime = localtime(&aClock);
/* Set the date to now */
db3Header.bYear = NewTime->tm_year;
db3Header.bMonth = (unsigned char)(NewTime->tm_mon + 1);
db3Header.bDay = (unsigned char)NewTime->tm_mday;
/* The number of records is already set */
nResult = fseek(DBFile, (long)0, SEEK_SET);
if (nResult != 0)
{
fprintf(stderr, "ERROR: File '%s', seek error (rewrite of \
header).\n",
szFileName);
fclose(DBFile);
exit(4);
}
nResult = fwrite((char *)&db3Header,
sizeof(DB3HEADER),
1,
DBFile);
if (nResult != 1)
{
fprintf(stderr, "ERROR: File '%s', write error (Database header \
rewrite).\n",
szFileName);
fclose(DBFile);
exit(4);
}
fclose(DBFile);
return(0);
}