文件系统HashWord文档下载推荐.docx
- 文档编号:22873264
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:16
- 大小:41.96KB
文件系统HashWord文档下载推荐.docx
《文件系统HashWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《文件系统HashWord文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
};
structCFTag
charcollision;
//冲突计数
charfree;
//空闲标志
//函数声明
inthashfile_creat(constchar*filename,mode_tmode,intreclen,intrecnum);
inthashfile_open(constchar*filename,intflags,mode_tmode);
inthashfile_close(intfd);
inthashfile_read(intfd,intkeyoffset,intkeylen,void*buf);
inthashfile_write(intfd,intkeyoffset,intkeylen,void*buf);
inthashfile_delrec(intfd,intkeyoffset,intkeylen,void*buf);
inthashfile_findrec(intfd,intkeyoffset,intkeylen,void*buf);
inthashfile_saverec(intfd,intkeyoffset,intkeylen,void*buf);
inthash(intkeyoffset,intkeylen,void*buf,intrecnum);
intcheckHashFileFull(intfd);
intreadHashFileHeader(intfd,structHashFileHeader*hfh);
HashFile.c
sys/types.h>
sys/stat.h>
fcntl.h>
stdio.h>
#include"
HashFile.h"
inthashfile_creat(constchar*filename,mode_tmode,intreclen,inttotal_rec_num)
structHashFileHeaderhfh;
intfd;
intrtn;
char*buf;
inti=0;
hfh.sig=31415926;
hfh.reclen=reclen;
hfh.total_rec_num=total_rec_num;
hfh.current_rec_num=0;
//fd=open(filename,mode);
fd=creat(filename,mode);
if(fd!
=-1)
{
rtn=write(fd,&
hfh,sizeof(structHashFileHeader));
//lseek(fd,sizeof(structHashFileHeader),SEEK_SET);
if(rtn!
buf=(char*)malloc((reclen+sizeof(structCFTag))*total_rec_num);
memset(buf,0,(reclen+sizeof(structCFTag))*total_rec_num);
rtn=write(fd,buf,(reclen+sizeof(structCFTag))*total_rec_num);
free(buf);
}
close(fd);
returnrtn;
else
return-1;
}
inthashfile_open(constchar*filename,intflags,mode_tmode)
intfd=open(filename,flags,mode);
if(read(fd,&
hfh,sizeof(structHashFileHeader))!
lseek(fd,0,SEEK_SET);
if(hfh.sig==31415926)
returnfd;
inthashfile_close(intfd)
returnclose(fd);
inthashfile_read(intfd,intkeyoffset,intkeylen,void*buf)
readHashFileHeader(fd,&
hfh);
intoffset=hashfile_findrec(fd,keyoffset,keylen,buf);
if(offset!
lseek(fd,offset+sizeof(structCFTag),SEEK_SET);
returnread(fd,buf,hfh.reclen);
inthashfile_write(intfd,intkeyoffset,intkeylen,void*buf)
returnhashfile_saverec(fd,keyoffset,keylen,buf);
//return-1;
inthashfile_delrec(intfd,intkeyoffset,intkeylen,void*buf)
intoffset;
offset=hashfile_findrec(fd,keyoffset,keylen,buf);
structCFTagtag;
read(fd,&
tag,sizeof(structCFTag));
tag.free=0;
//置空闲标志
lseek(fd,offset,SEEK_SET);
write(fd,&
intaddr=hash(keyoffset,keylen,buf,hfh.total_rec_num);
offset=sizeof(structHashFileHeader)+addr*(hfh.reclen+sizeof(structCFTag));
if(lseek(fd,offset,SEEK_SET)==-1)
tag.collision--;
//冲突记数减1
//
hfh.current_rec_num--;
//当前记录数减1
inthashfile_findrec(intfd,intkeyoffset,intkeylen,void*buf)
intoffset=sizeof(structHashFileHeader)+addr*(hfh.reclen+sizeof(structCFTag));
charcount=tag.collision;
if(count==0)
//不存在
recfree:
if(tag.free==0)
offset+=hfh.reclen+sizeof(structCFTag);
gotorecfree;
char*p=(char*)malloc(hfh.reclen*sizeof(char));
read(fd,p,hfh.reclen);
//printf("
Recordis{%d,%s}\n"
((structjtRecord*)p)->
key,((structjtRecord*)p)->
other);
char*p1,*p2;
p1=(char*)buf+keyoffset;
p2=p+keyoffset;
intj=0;
while((*p1==*p2)&
&
(j<
keylen))
p1++;
p2++;
j++;
if(j==keylen)
free(p);
p=NULL;
return(offset);
//找到,返回偏移值
if(addr==hash(keyoffset,keylen,p,hfh.total_rec_num))
count--;
//hash值相等而key值不等
inthashfile_saverec(intfd,intkeyoffset,intkeylen,void*buf)
if(checkHashFileFull(fd))
tag.collision++;
lseek(fd,sizeof(structCFTag)*(-1),SEEK_CUR);
while(tag.free!
=0)//冲突,顺序探查
if(offset>
=lseek(fd,0,SEEK_END))
offset=sizeof(structHashFileHeader);
//reachatend,thenrewind
tag.free=1;
write(fd,buf,hfh.reclen);
hfh.current_rec_num++;
//当前记录数加1
returnwrite(fd,&
//存入记录
inthash(intkeyoffset,intkeylen,void*buf,inttotal_rec_num)
char*p=(char*)buf+keyoffset;
intaddr=0;
for(i=0;
i<
keylen;
i++)
addr+=(int)(*p);
p++;
returnaddr%(int)(total_rec_num*COLLISIONFACTOR);
intreadHashFileHeader(intfd,structHashFileHeader*hfh)
returnread(fd,hfh,sizeof(structHashFileHeader));
intcheckHashFileFull(intfd)
if(hfh.current_rec_num<
hfh.total_rec_num)
return0;
return1;
jtRecord.h
#defineRECORDLEN32
structjtRecord
intkey;
charother[RECORDLEN-sizeof(int)];
#ifdefHAVE_CONFIG_H
config.h>
#endif
jtRecord.c
stdlib.h>
string.h>
jtRecord.h"
#defineKEYOFFSET0
#defineKEYLENsizeof(int)
#defineFILENAME"
jing.hash"
voidshowHashFile();
intmain(intargc,char*argv[])
structjtRecordrec[6]=
{1,"
jing"
},{2,"
wang"
},{3,"
li"
},{4,"
zhang"
},{5,"
qing"
},{6,"
yuan"
};
for(j=0;
j<
6;
j++)
printf("
<
%d,%d>
\t"
rec[j].key,hash(KEYOFFSET,KEYLEN,&
rec[j],6));
intfd=hashfile_creat(FILENAME,O_RDWR|O_CREAT,RECORDLEN,6);
\nOpenansSaveRecord...\n"
);
fd=hashfile_open(FILENAME,O_RDWR,0);
hashfile_saverec(fd,KEYOFFSET,KEYLEN,&
rec[i]);
hashfile_close(fd);
showHashFile();
//DemofindRec
\nFindRecord..."
intoffset=hashfile_findrec(fd,KEYOFFSET,KEYLEN,&
rec[4]);
\noffsetis%d\n"
offset);
structjtRecordjt;
fd=open(FILENAME,O_RDWR);
Tagis<
tag.collision,tag.free);
jt,sizeof(structjtRecord));
jt.key,jt.other);
//DemoDeleteRec
\nDeleteRecord..."
hashfile_delrec(fd,KEYOFFSET,KEYLEN,&
rec[2]);
//DemoRead
charbuf[32];
memcpy(buf,&
rec[1],KEYLEN);
hashfile_read(fd,KEYOFFSET,KEYLEN,buf);
\nReadRecordis{%d,%s}\n"
((structjtRecord*)buf)->
key,((structjtRecord*)buf)->
//DemoWrite
\nWriteRecord..."
hashfile_write(fd,KEYOFFSET,KEYLEN,&
rec[3]);
voidshowHashFile()
\n"
lseek(fd,sizeof(structHashFileHeader),SEEK_SET);
while
(1)
if(read(fd,&
tag,sizeof(structCFTag))<
=0)
break;
jt,sizeof(structjtRecord))<
运行结果:
五、实验小结
通过这次实验,在同学的帮助下学会了如何同时编译多个文件,即在-gcc–o后面同时添加2个文件名便可同时编译成功2个文件了。
六、附录
《网络编程技术与应用》
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件系统 Hash