www.pudn.com > database_edwardversion.rar > file.c
#include#include #include #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 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 iTableNum;i++) { ptable1->columnhead = pcolumn1; // Chain columns to table for(j=0;j 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 iTableNum;i++) { pcolumn1 = ptable1->columnhead; // Chain columns to table for(j=0;j iColNum;j++) { pcolumn1->datahead = pdata1; // Chain datas to column for(k=0;k 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 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 iTableNum;i++) { pcolumn = ptable->columnhead; for(j=0;j 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 iTableNum;i++) { pcolumn = ptable->columnhead; for(j=0;j iColNum;j++) { pdata = pcolumn->datahead; for(k=0;k 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); }