📄 create_t.c
字号:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "struct.h"
void create_table(char * _table_name,char _field_name[10][30],int * _field_type,int * _field_lenth,int col_num)
/*表名,字段名组,字段类型组,字段长度组,字段数*/
{
struct tab_dic_type tab_dic,tab_dic_temp,free_block;/*定义表字典对象*/
struct col_dic_type col_dic;/*定义列字典对象*/
struct data_head head_data,head_data_temp;/*定义数据头对象*/
FILE *tab_fp,*col_fp,*data_fp;
char *data;
int *int_data;
int i,id,offset;
int repet=0;
id=-1;
if((tab_fp=fopen("TABLE","rb+"))==NULL)
{
printf("cann't open file TABLE\n");
exit(0);
}/*打开表字典文件*/
if((col_fp=fopen("COLUMN","ab+"))==NULL)
{
printf("cann't open file COLUMN\n");
exit(0);
}/*打开列字典文件*/
if((data_fp=fopen("DATABASE","rb+"))==NULL)
{
printf("cann't open file DATABASE\n");
exit(0);
}/*打开数据文件*/
if (strlen(_table_name)>100)/*表名长度判断*/
printf("table name is too long!\n");
else/*填写表字典信息*/
{
while (!feof(tab_fp))/*表名是否重复*/
{
id=id+1;
if (id==0)
fread(&free_block,sizeof(struct tab_dic_type),1,tab_fp);
else
{
if (fread(&tab_dic_temp,sizeof(struct tab_dic_type),1,tab_fp)!=1)
{
}
if (strcmp(tab_dic_temp.tab_name,_table_name)==0)
{
printf("table name is repetitional\n");
repet=1;
break;
}
}
}
}
if (repet!=1)
{
if (id==0)
{
free_block.tab_id=0;
free_block.first_free_block=0;
if (fwrite(&free_block,sizeof(struct tab_dic_type),1,tab_fp)!=1)
printf(" TABLE file(free_block) write error!\n");
id=id+1;
}
strcpy(tab_dic.tab_name,_table_name);
tab_dic.tab_id=id;
tab_dic.first_free_block=free_block.first_free_block;
tab_dic.col_num=col_num;
tab_dic.row_num=0;
tab_dic.row_len=0;
for(i=0;i<col_num;i++)
{
if (strlen(&_field_name[i])>100)/*列名长度判断*/
printf("field name is too long!\n");
else/*填写列字典信息*/
{
col_dic.tab_id=tab_dic.tab_id;
strcpy(col_dic.col_name,&_field_name[i]);
col_dic.col_id=tab_dic.tab_id*100+i;
col_dic.col_type=_field_type[i];
//printf("col_dic.col_type=%d\n",col_dic.col_type );
col_dic.col_length=_field_lenth[i];
// printf("col_dic.col_length=%d\n",col_dic.col_length );
tab_dic.row_len=tab_dic.row_len+_field_lenth[i]+1;
if (fwrite(&col_dic,sizeof(struct col_dic_type),1,col_fp)!=1)
printf("COLUMN file write error!\n");
}
}
if (fwrite(&tab_dic,sizeof(struct tab_dic_type),1,tab_fp)!=1)
printf(" TABLE file write error!\n");
//读取空闲块块头信息
fseek(data_fp,tab_dic.first_free_block*1024,0);
fread(&head_data_temp,sizeof(struct data_head),1,data_fp);
if (head_data_temp.last_block==-2)
free_block.first_free_block=head_data_temp.next_block;
else
free_block.first_free_block= free_block.first_free_block+1;
fseek(tab_fp,0,0);
if (fwrite(&free_block,sizeof(struct tab_dic_type),1,tab_fp)!=1)
printf(" TABLE file(free_block) write error!\n");
/*填写数据头信息*/
head_data.next_block=-1;
head_data.last_block=-1;
head_data.next_free_addr=tab_dic.first_free_block*1024+24;
fseek(data_fp,tab_dic.first_free_block*1024,0);
if (fwrite(&head_data,sizeof(struct data_head),1,data_fp)!=1)
printf("DATABASE file(data_head) write error!\n");
fseek(data_fp,tab_dic.first_free_block*1024+24,0);
offset=ftell(data_fp);
while (offset<=(tab_dic.first_free_block+1)*1024-1)
{
data=(char *)malloc(tab_dic.row_len);
for(i=0;i<tab_dic.row_len;i++)
data[i]='\0';
int_data=data;
*int_data=offset+tab_dic.row_len;
offset=offset+tab_dic.row_len;
if (fwrite(data,tab_dic.row_len,1,data_fp)!=1)
printf("DATABASE file write error!\n");
}
fclose(tab_fp);
fclose(col_fp);
fclose(data_fp);
}
}
void drop_table(char * _table_name)
/*表名*/
{struct tab_dic_type tab_dic,tab_dic_temp,free_block;/*定义表字典对象*/
// struct col_dic_type col_dic;/*定义列字典对象*/
// struct data_head head_data,head_data_temp;/*定义数据头对象*/
FILE *tab_fp,*col_fp;
char *data;
int *int_data;
int i,id,offset;
int repet=0;
id=-1;
if((tab_fp=fopen("TABLE","rb+"))==NULL)
{
printf("cann't open file TABLE\n");
exit(0);
}/*打开表字典文件*/
while (!feof(tab_fp))/*表名是否重复*/
{
id=id+1;
if (id==0)
fread(&free_block,sizeof(struct tab_dic_type),1,tab_fp);
else
{
if (fread(&tab_dic_temp,sizeof(struct tab_dic_type),1,tab_fp)!=1)
{ // printf(" TABLE file read error!\n");
}
if (strcmp(tab_dic_temp.tab_name,_table_name)==0)
{//printf("table name is repetitional\n");
repet=1;
break;
}
}
}
if (repet!=1)
{
printf("Table %s is not existed\n",_table_name);
return;
}
for(i=strlen(tab_dic_temp.tab_name)+1;i>0;i--)
tab_dic_temp.tab_name[i]=tab_dic_temp.tab_name[i-1];
tab_dic_temp.tab_name[0]='$';
fseek(tab_fp,-sizeof(struct tab_dic_type),SEEK_CUR);
if (fwrite(&tab_dic_temp,sizeof(struct tab_dic_type),1,tab_fp)!=1)
printf(" TABLE file write error!\n");
fclose(tab_fp);
/* fseek(data_fp,tab_dic.first_free_block*1024,0);
fread(&head_data_temp,sizeof(struct data_head),1,data_fp);
if (head_data_temp.last_block==-2)
free_block.first_free_block=head_data_temp.next_block;
else
free_block.first_free_block= free_block.first_free_block+1;
fseek(tab_fp,0,0);
if (fwrite(&free_block,sizeof(struct tab_dic_type),1,tab_fp)!=1)
printf(" TABLE file(free_block) write error!\n");
*/
/* head_data.next_block=-1;
head_data.last_block=-1;
head_data.next_free_addr=tab_dic.first_free_block*1024+24;
fseek(data_fp,tab_dic.first_free_block*1024,0);
if (fwrite(&head_data,sizeof(struct data_head),1,data_fp)!=1)
printf("DATABASE file(data_head) write error!\n");
fseek(data_fp,tab_dic.first_free_block*1024+24,0);
offset=ftell(data_fp);
while (offset<=(tab_dic.first_free_block+1)*1024-1)
{data=(char *)malloc(tab_dic.row_len);
for(i=0;i<tab_dic.row_len;i++)
data[i]='\0';
int_data=data;
*int_data=offset+tab_dic.row_len;
offset=offset+tab_dic.row_len;
if (fwrite(data,tab_dic.row_len,1,data_fp)!=1)
printf("DATABASE file write error!\n");
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -