📄 file.c
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "database.h"
/*///////////////////////////////////////////////////////////////////
the functions below are used to load a database or save a
database
Author: Edward Lee
///////////////////////////////////////////////////////////////////**/
/*---------------------------------------
Open Function :
Load datas from a file and create
chained lists
---------------------------------------*/
void Open(void)
{
FILE *fp;
char filename[FILE_NAME]; ////////
int i=0,j=0,k=0;
int len_filename;
struct table *ptable1,*ptable2;
struct column *pcolumn1,*pcolumn2;
struct data *pdata1,*pdata2;
struct database *database;
// the path of the file
printf("Please input the filename(or the filepath) for file open(with postfix [.db]):\n");
scanf(" %s",filename);
// check the filename, if wrong, reinput
len_filename=strlen(filename);
while(filename[len_filename-1]!='b'||filename[len_filename-2]!='d'||filename[len_filename-3]!='.')
{
printf("postfix of the filename wrong! Input again:");
scanf(" %s",filename);
len_filename=strlen(filename);
}
// Open the file for reading
if( (fp=fopen(filename,"rb"))==NULL )
{
printf("cannot open file!\n");
return;
}
// Read the database infomation
if(databasehead==NULL) // if NULL, no database in the memory
{
databasehead = (struct database *)malloc(LEN_DATABASE);
if( ( fread(databasehead,LEN_DATABASE-8,1,fp) )!=1 )
{ printf("file read error!\n");
return;
}
databasehead->next = NULL; // End database chained list
}
else // another database
{
database=databasehead;
while(database->next!=NULL) database=database->next;
database->next = (struct database *)malloc(LEN_DATABASE);
if( ( fread(database->next,LEN_DATABASE-8,1,fp) )!=1 )
{ printf("file read error!\n");
return;
}
database->next->next = NULL; // End database chained list
}
// Read the table infomation
ptable1 = ptable2 = (struct table *)malloc(LEN_TABLE);
databasehead->tablehead = ptable1;
for(i=0;i<databasehead->iTableNum;i++)
{ if( ( fread(ptable1,LEN_TABLE-8,1,fp) )!=1 )
{ printf("file read error!\n");
return;
}
ptable2=ptable1;
ptable1->next = (struct table *)malloc(LEN_TABLE);
ptable1 = ptable1->next;
}
ptable2->next = NULL; // End table chained list
// free(ptable1); //////// ///////// ///////// /////////////
// Read the column infomation
ptable1 = databasehead->tablehead; // Chain tables to database
pcolumn1 = pcolumn2 = (struct column *)malloc(LEN_COLUMN);
for(i=0;i<databasehead->iTableNum;i++)
{ ptable1->columnhead = pcolumn1; // Chain columns to table
for(j=0;j<ptable1->iColNum;j++)
{ if( ( fread(pcolumn1,LEN_COLUMN-8,1,fp) )!=1 )
{ printf("file read error!\n");
return;
}
pcolumn2 = pcolumn1;
pcolumn1->next = (struct column *)malloc(LEN_COLUMN);
pcolumn1 = pcolumn1->next;
}
pcolumn2->next = NULL; // End column chained list
// free(pcolumn1); //////////// //////// /////////////// //////////
ptable1 = ptable1->next; // Next table
}
// Read the real data
ptable1 = databasehead->tablehead; // Chain tables to database
pdata1 = pdata2 = (struct data *)malloc(LEN_DATA);
for(i=0;i<databasehead->iTableNum;i++)
{ pcolumn1 = ptable1->columnhead; // Chain columns to table
for(j=0;j<ptable1->iColNum;j++)
{ pcolumn1->datahead = pdata1; // Chain datas to column
for(k=0;k<pcolumn1->iLineNum;k++)
{ if( ( fread(pdata1,LEN_DATA-4,1,fp) )!=1 )
{ printf("file read error!\n");
return;
}
pdata2 = pdata1;
pdata1->next = (struct data *)malloc(LEN_DATA);
pdata1 = pdata1->next; // Next data
}
pdata2->next = NULL;
// free(pdata1); //////////// ////////// ////////// ////////
pcolumn1 = pcolumn1->next; // Next column
}
ptable1 = ptable1->next; // Next table
}
// Close the file
fclose(fp);
}
/*---------------------------------------
Save Function :
Save chained lists into a file
---------------------------------------*/
void SaveDatabase(struct database *database)
{
FILE *fp;
int i,j,k;
int len_filename; // for checking the postfix of filename
struct table *ptable;
struct column *pcolumn;
struct data *pdata;
char filename[MAX_NAME];
// the path of the file
printf("Please input the filename(or the filepath) for file save(with postfix [.db]):\n");
scanf(" %s",filename);
// check the filename, if wrong, reinput
len_filename=strlen(filename);
while(filename[len_filename-1]!='b'||filename[len_filename-2]!='d'||filename[len_filename-3]!='.')
{
printf("postfix of the filename wrong! Input again:");
scanf(" %s",filename);
len_filename=strlen(filename);
}
// Open the file for writing
if( ( fp=fopen(filename,"wb") )==NULL )
{
printf("cannot open file!\n");
return;
}
// Write the database infomation
if( ( fwrite(database,sizeof(struct database)-8,1,fp) )!=1 )
{ printf("file write error!\n");
return;
}
// Write the table infomation
ptable = database->tablehead;
for(i=0;i<database->iTableNum;i++)
{ if( ( fwrite(ptable,sizeof(struct table)-8,1,fp) )!=1 )
{ printf("file write error!\n");
return;
}
ptable = ptable->next;
}
// Write the column infomation
ptable = database->tablehead;
for(i=0;i<database->iTableNum;i++)
{ pcolumn = ptable->columnhead;
for(j=0;j<ptable->iColNum;j++)
{ if( ( fwrite(pcolumn,sizeof(struct column)-8,1,fp) )!=1 )
{ printf("file write error!\n");
return;
}
pcolumn = pcolumn->next;
}
ptable = ptable->next;
}
// Write the real data
ptable = database->tablehead;
for(i=0;i<database->iTableNum;i++)
{ pcolumn = ptable->columnhead;
for(j=0;j<ptable->iColNum;j++)
{ pdata = pcolumn->datahead;
for(k=0;k<pcolumn->iLineNum;k++)
{ if( ( fwrite(pdata,sizeof(struct data)-4,1,fp) )!=1 )
{ printf("file write error!\n");
return;
}
pdata = pdata->next; // Next data
}
pcolumn = pcolumn->next; // Next column
}
ptable = ptable->next; // Next table
}
// Close the file
fclose(fp);
}
void Save(void)
{
struct database *pdb;
char databasename[MAX_NAME];
ShowDatabaseInfo();
printf("Database Name:");
scanf(" %s",databasename);
pdb=GetDatabase(databasename);
SaveDatabase(pdb);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -