⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 1.简介 本程序是用纯C语言编的一个基于菜单命令行的数据库系统。可以创建多个数据库
💻 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 + -