c语言文件管理

weixin_46633609 2020-09-08 03:18:53
我的这个程序新建文件系统时功能都能实现,但是当建好之后在打开已经有的系统时,里面储存的信息就没了,来大佬帮我看看代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>


#define SYS_SIZE 0XFFFFF*100
#define BLOCK_SIZE 512

FILE *f;

struct filsys{
int s_nfree;
long s_free[100];
int s_ninode;
int s_inode[96];

}*p;

struct index_block{
int s_nfree;
long s_free[96];
}q;

struct filelist{
char name[14];
int inode_num;
}file;

struct inode{
int i_size;
int block_amount;
long i_addr[16];
char create_time[25];
}inode;

struct fcb{
char name[12];
int inode_num;
int used;
int i_size;
int block_amount;
long i_addr[16];
}fcb[5],*ptr;

struct open_file_table{
int offset;
struct fcb* f_node;
}table[5];

struct fd{
struct open_file_table* t_node;
}fd[5];

FILE* apply_room(char *sys_name)
{
f = fopen(sys_name,"w+b"); //创建一个新的可读写的二进制文件
fseek(f,SYS_SIZE,SEEK_SET);
fputc(EOF, f);
fclose(f);
return fopen(sys_name,"r+b"); //打开一个可读写的二进制文件
}

void myfree(long block_num)
{
int i;
if(p->s_nfree<100)
{
p->s_free[p->s_nfree]=block_num;
p->s_nfree++;
}
else
{
q.s_nfree=p->s_nfree;
for(i=0;i<100;i++)
q.s_free[i]=p->s_free[i];
fseek(f,(block_num-1)*BLOCK_SIZE,SEEK_SET);
fwrite(&q,sizeof(struct index_block),1,f);
p->s_nfree=1;
p->s_free[0]=block_num;
}
}

long myalloc()
{
int i;
long a;
p->s_nfree--;
if(p->s_nfree==0){
a=p->s_free[0];
fseek(f,(a-1)*BLOCK_SIZE,SEEK_SET);
fread(&q,sizeof(struct index_block),1,f);
p->s_nfree=q.s_nfree;
for(i=0;i<100;i++)
p->s_free[i]=q.s_free[i];
return a;
}else return p->s_free[p->s_nfree];
}

void init()
{
int j;
long i;
p->s_nfree=1;
p->s_free[0]=0;
p->s_ninode=96;
for(i=0;i<96;i++)
p->s_inode[i]=-1;
for(i=22;i<=SYS_SIZE/BLOCK_SIZE;i++)
myfree(i);
j=p->s_nfree+1;
while(j<100)
p->s_free[j++]=0;
fseek(f,0,SEEK_SET);
fwrite(p,sizeof(struct filsys),1,f);
}

int ialloc(){
int i=0;
while(p->s_inode[i]>=0) i++;
p->s_inode[i]=0;
p->s_ninode--;
return i;
}

int namei(char *name)
{
int k=0;
while(k<96){
if(p->s_inode[k]!=-1){
fseek(f,BLOCK_SIZE+k*16,SEEK_SET);
fread(&file,sizeof(struct filelist),1,f);
if(!strcmp(file.name,name))
return file.inode_num;
}
k++;
};
return -1;
}

int name_i(char *name)
{
int k=0;
do
{
if(fcb[k].used==1)
{
if(!strcmp(fcb[k].name,name))
return fcb[k].inode_num;
}
k++;
}while(k<5);
return -1;
}
void create() //创建
{
int i,inode_num;
long t;
char name[12];
printf("输入文件名:");
scanf("%s",name);
getchar();
if(namei(name)!=-1) printf("file exited!\n");
else
{
inode_num=ialloc();
strcpy(file.name,name);
file.inode_num=inode_num;
fseek(f,BLOCK_SIZE+inode_num*16,SEEK_SET);
fwrite(&file,sizeof(struct filelist),1,f);
inode.i_size=0;
inode.block_amount=0;
for(i=0;i<16;i++) inode.i_addr[i]=0;
time(&t);
strcpy(inode.create_time,ctime(&t));
fseek(f,4*BLOCK_SIZE+inode_num*sizeof(struct inode),SEEK_SET);
fwrite(&inode,sizeof(struct inode),1,f);
p->s_inode[inode_num]=0;
printf("创建成功!\n");
}
}
void main()
{
int i;
char ch,sys_name[15];
p=(struct filsys *)malloc(sizeof(struct filsys));
while(1)
{
printf("1:创建新文件系统\n");
printf("2:打开现有的文件系统\n");
printf("choose:");
if((ch=getchar())=='1')
{
printf("输入文件系统的名称:");
scanf("%s",sys_name);
getchar();
f=apply_room(sys_name);
init();
break; //这里的break用来跳出while(1)的循环
}
else if(ch=='2')
{
printf("输入文件系统的名称:");
scanf("%s",sys_name);
getchar();
f=fopen(sys_name,"r+b");
fseek(f,0,SEEK_SET);
fread(p,sizeof(struct filsys),1,f);
break;
}
else
{
printf("wrong input!\n");
getchar();
}
};
for(i=0;i<5;i++)
{
fcb[i].used=0;
table[i].f_node=NULL;
fd[i].t_node=NULL;
}
while(1)
{
printf("--------------------------------------------------------------------\n");
printf("1:创建 2:打开 3:写文件 4:读文件 5:关闭 6:删除 7:显示 8:退出\n");
printf("choose:");
switch(getchar()-'0')
{
case 1:create();break;
case 2:open_file();break;
case 3:write_file();break;
case 4:read_file();break;
case 5:close_file();break;
case 6:del_file();break;
case 7:display();break;
case 8:myexit();break;
default:getchar(); printf("输入错误!\n"); break;
}
};
free(p);
fclose(f);
}
...全文
134 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-07
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
weixin_46633609 2020-09-08
  • 打赏
  • 举报
回复

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧