欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年文件系统——Hash .pdf

    • 资源ID:25941345       资源大小:155.48KB        全文页数:11页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年文件系统——Hash .pdf

    文件系统 Hash一、实验目的1、理解 linux 文件系统的内部技术2、掌握 linux 与文件有关的系统调用命令,并在此基础上建立面向随机检索的 hash结构文件。二、实验内容与设计思想实验内容:1、 参考教程中 Hash文件构造算法, 设计一组 Hash文件函数,包括 Hash文件创建、打开、关闭、读、写等。2、编写测试程序,通过记录保存、查找、删除等操作,检查上述Hash文件是否实现相关功能。三、实验使用环境Linux Redhat4 四、实验结果实验代码:HashFile.h #include #define COLLISIONFACTOR 0.5 /Hash函数冲突因子struct HashFileHeader int sig; /Hash文件印鉴int reclen; /记录长度int total_rec_num; /总记录数int current_rec_num; /当前记录数; struct CFTag char collision; /冲突计数char free; /空闲标志; /函数声明int hashfile_creat(const char *filename,mode_t mode,int reclen,int recnum); int hashfile_open(const char *filename,int flags, mode_t mode); int hashfile_close(int fd); int hashfile_read(int fd,int keyoffset,int keylen,void *buf); int hashfile_write(int fd,int keyoffset,int keylen,void *buf); int hashfile_delrec(int fd,int keyoffset,int keylen,void *buf); int hashfile_findrec(int fd,int keyoffset,int keylen,void *buf); int hashfile_saverec(int fd,int keyoffset,int keylen,void *buf); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - int hash(int keyoffset,int keylen,void *buf,int recnum); int checkHashFileFull(int fd); int readHashFileHeader(int fd,struct HashFileHeader *hfh ) ; HashFile.c #include #include #include #include #include #include HashFile.h int hashfile_creat(const char *filename,mode_t mode,int reclen,int total_rec_num) struct HashFileHeader hfh; int fd; int rtn; char *buf; int i=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(struct HashFileHeader); /lseek(fd,sizeof(struct HashFileHeader),SEEK_SET); if(rtn!=-1) buf=(char*)malloc(reclen+sizeof(struct CFTag)*total_rec_num); memset(buf,0,(reclen+sizeof(struct CFTag)*total_rec_num); rtn=write(fd,buf,(reclen+sizeof(struct CFTag)*total_rec_num); free(buf); close(fd); return rtn; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - else close(fd); return -1; int hashfile_open(const char *filename,int flags, mode_t mode) int fd=open(filename,flags,mode); struct HashFileHeader hfh; if(read(fd,&hfh,sizeof(struct HashFileHeader)!=-1) lseek(fd,0,SEEK_SET); if(hfh.sig=31415926) return fd; else return -1; else return -1; int hashfile_close(int fd) return close(fd); int hashfile_read(int fd,int keyoffset,int keylen,void *buf) struct HashFileHeader hfh; readHashFileHeader(fd,&hfh); int offset=hashfile_findrec(fd,keyoffset,keylen,buf); if(offset!=-1) lseek(fd,offset+sizeof(struct CFTag),SEEK_SET); return read(fd,buf,hfh.reclen); else return -1; int hashfile_write(int fd,int keyoffset,int keylen,void *buf) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - return hashfile_saverec(fd,keyoffset,keylen,buf); /return -1; int hashfile_delrec(int fd,int keyoffset,int keylen,void *buf) int offset; offset=hashfile_findrec(fd,keyoffset,keylen,buf); if(offset!=-1) struct CFTag tag; read(fd,&tag,sizeof(struct CFTag); tag.free=0; /置空闲标志lseek(fd,offset,SEEK_SET); write(fd,&tag,sizeof(struct CFTag); struct HashFileHeader hfh; readHashFileHeader(fd,&hfh); int addr=hash(keyoffset,keylen,buf,hfh.total_rec_num); offset=sizeof(struct HashFileHeader)+addr*(hfh.reclen+sizeof(struct CFTag); if(lseek(fd,offset,SEEK_SET)=-1) return -1; read(fd,&tag,sizeof(struct CFTag); tag.collision-; /冲突记数减 1 lseek(fd,offset,SEEK_SET); / write(fd,&tag,sizeof(struct CFTag); hfh.current_rec_num-; /当前记录数减 1 lseek(fd,0,SEEK_SET); write(fd,&hfh,sizeof(struct HashFileHeader); else return -1; int hashfile_findrec(int fd,int keyoffset,int keylen,void *buf) struct HashFileHeader hfh; readHashFileHeader(fd,&hfh); int addr=hash(keyoffset,keylen,buf,hfh.total_rec_num); int offset=sizeof(struct HashFileHeader)+addr*(hfh.reclen+sizeof(struct CFTag); if(lseek(fd,offset,SEEK_SET)=-1) return -1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - struct CFTag tag; read(fd,&tag,sizeof(struct CFTag); char count=tag.collision; if(count=0) return -1; /不存在recfree: if(tag.free=0) offset+=hfh.reclen+sizeof(struct CFTag); if(lseek(fd,offset,SEEK_SET)=-1) return -1; read(fd,&tag,sizeof(struct CFTag); goto recfree; else char *p=(char*)malloc(hfh.reclen*sizeof(char); read(fd,p,hfh.reclen); /printf(Record is %d,%sn,(struct jtRecord*)p)-key,(struct jtRecord*)p)-other); char *p1,*p2; p1=(char*)buf+keyoffset; p2=p+keyoffset; int j=0; while(*p1=*p2)&(j=lseek(fd,0,SEEK_END) offset=sizeof(struct HashFileHeader);/reach at end,then rewind if(lseek(fd,offset,SEEK_SET)=-1) return -1; read(fd,&tag,sizeof(struct CFTag); tag.free=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - lseek(fd,sizeof(struct CFTag)*(-1),SEEK_CUR); write(fd,&tag,sizeof(struct CFTag); write(fd,buf,hfh.reclen); hfh.current_rec_num+; /当前记录数加 1 lseek(fd,0,SEEK_SET); return write(fd,&hfh,sizeof(struct HashFileHeader); /存入记录 int hash(int keyoffset,int keylen,void *buf,int total_rec_num) int i=0; char *p=(char *)buf+keyoffset; int addr=0; for(i=0;ikeylen;i+) addr+=(int)(*p); p+; return addr%(int)(total_rec_num*COLLISIONFACTOR); int readHashFileHeader(int fd,struct HashFileHeader *hfh ) lseek(fd,0,SEEK_SET); return read(fd,hfh,sizeof(struct HashFileHeader); int checkHashFileFull(int fd) struct HashFileHeader hfh; readHashFileHeader(fd,&hfh); if(hfh.current_rec_numhfh.total_rec_num) return 0; else return 1; jtRecord.h #define RECORDLEN 32 struct jtRecord int key; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - char otherRECORDLEN-sizeof(int); ; #ifdef HAVE_CONFIG_H #include #endif jtRecord.c #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include HashFile.h #include jtRecord.h #define KEYOFFSET 0 #define KEYLEN sizeof(int) #define FILENAME jing.hash void showHashFile(); int main(int argc, char *argv) struct jtRecord rec6= 1,jing,2,wang,3,li,4,zhang,5,qing,6,yuan ; int j=0; for(j=0;j6;j+) printf(t,recj.key,hash(KEYOFFSET,KEYLEN,&recj,6); int 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - fd=hashfile_creat(FILENAME,O_RDWR|O_CREAT,RECORDLEN,6); int i=0; printf(nOpen ans Save Record.n); fd=hashfile_open(FILENAME,O_RDWR,0); for(i=0;i6;i+) hashfile_saverec(fd,KEYOFFSET,KEYLEN,&reci); hashfile_close(fd); showHashFile(); /Demo find Rec printf(nFind Record.); fd=hashfile_open(FILENAME,O_RDWR,0); int offset=hashfile_findrec(fd,KEYOFFSET,KEYLEN,&rec4); printf(noffset is %dn,offset); hashfile_close(fd); struct jtRecord jt; struct CFTag tag; fd=open(FILENAME,O_RDWR); lseek(fd,offset,SEEK_SET); read(fd,&tag,sizeof(struct CFTag); printf(Tag is t,tag.collision,tag.free); read(fd,&jt,sizeof(struct jtRecord); printf(Record is %d,%sn,jt.key,jt.other); /Demo Delete Rec printf(nDelete Record.); fd=hashfile_open(FILENAME,O_RDWR,0); hashfile_delrec(fd,KEYOFFSET,KEYLEN,&rec2); hashfile_close(fd); showHashFile(); /Demo Read fd=hashfile_open(FILENAME,O_RDWR,0); char buf32; memcpy(buf,&rec1,KEYLEN); hashfile_read(fd,KEYOFFSET,KEYLEN,buf); printf(nRead Record is %d,%sn,(struct jtRecord*)buf)-key,(struct jtRecord*)buf)-other); hashfile_close(fd); /Demo Write 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - printf(nWrite Record.); fd=hashfile_open(FILENAME,O_RDWR,0); hashfile_write(fd,KEYOFFSET,KEYLEN,&rec3); hashfile_close(fd); showHashFile(); return 0; void showHashFile() int fd; printf(n); fd=open(FILENAME,O_RDWR); lseek(fd,sizeof(struct HashFileHeader),SEEK_SET); struct jtRecord jt; struct CFTag tag; while(1) if (read(fd,&tag,sizeof(struct CFTag)=0) break; printf(Tag is t,tag.collision,tag.free); if(read(fd,&jt,sizeof(struct jtRecord)=0) break; printf(Record is %d,%sn,jt.key,jt.other); close(fd); 运行结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 五、实验小结通过这次实验, 在同学的帮助下学会了如何同时编译多个文件,即在-gcc o后面同时添加 2 个文件名便可同时编译成功2 个文件了。六、附录网络编程技术与应用名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -

    注意事项

    本文(2022年文件系统——Hash .pdf)为本站会员(Q****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开