您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 实验四Linux的文件处理
实验四Linux的文件处理1.目的要求(1)学习和掌握gcc等Linux的开发调试环境。(2)学习并掌握Linux的文件操作。(3)编写并实现“学生管理系统”程序。2.实验内容(1)文件底层系统调用实验使用vi将程序清单4-1和4-2的程序输入,并在当前目录下创建文件“file.in”和文件“file.out”,尽可能的使文件“file.in”大一些。利用gcc分别编译这两个程序,写出编译命令和执行结果;如果不成功,尝试利用gdb调试。实现将file.in中的内容复制到file.out中;仔细观察这两个程序,比较标准C的文件操作和Linux的系统调用open、read、write等的使用区别。_两者的描述符不一样,写入和读入调用的函数也是不一样,一个是底层系统调用,一个是库函数,带的参数也不一样,方法大致是一致的按照说明重新修改程序4-2,并使用time命令察看程序执行的时间效率上有何区别。分别是注释前和注释后的运行时间输入、编译并运行程序4-3和4-4,写出执行结果,并比较他们fseek和lseek在使用方法上的异同。创建了一个名为hole.file的文件文件的内容是、内容无差异(2)目录信息的单层浏览使用vi将程序清单4-5和4-6程序输入。利用gcc分别编译这两个程序,写出编译命令和执行结果;如果不成功,尝试利用gdb调试。搜索Mydirection目录里的内容;仔细观察这两个程序,比较它们的区别。后者是封装函数,方便使用而且不需要知道原理;(3)录信息的完整浏览使用vi将程序清单4-7和4-8程序输入。利用gcc分别编译这两个程序,写出编译命令和执行结果;如果不成功,尝试利用gdb调试。4_7.:4_8:递归显示工作目录的信息仔细阅读、比较这两个程序,并写出目录浏览的算法描述。递归显示每个目录信息,子目录显示完返回到主目录;(4)mmap、msync和munmap的使用使用vi将程序清单4-9程序输入。利用gcc编译程序,写出编译命令和执行结果;如果不成功,尝试利用gdb调试。创建了record.dat仔细阅读程序,并画出程序流程图。(5)学习并分别使用标准C的文件操作函数和Linux的系统调用创建一个对学生基本信息进行操作(插入、修改和删除)的C程序,学生基本信息以结构体的形式存储在文件stu.info中。structstu_info的定义如下:3.主要仪器设备及软件(1)硬件:计算机、网络(2)软件:VMWareworkstation、RedHat9.04.附录:程序清单(1)程序清单4-1#includestdio.h#includestdlib.hintmain(void){charc;FILE*in,*out;if((in=fopen(file.in,r))==NULL){perror(fileopenerror!);exit(0);}out=fopen(file.out,w);while((c=fgetc(in))!=EOF)fputc(c,out);fclose(in);fclose(out);}(2)程序清单4-2#includeunistd.h#includesys/stat.h#includefcntl.hintmain(){//charblock[1024];charc;intin,out;intnread;in=open(file.in,O_RDONLY);out=open(file.out,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);//将注释打开,并将两条语句的后一句注释掉,重新编译执行。//while((nread=read(in,block,sizeof(block)))0)while((nread=read(in,&c,sizeof(c)))0)//write(out,block,nread);write(out,&c,nread);close(in);close(out);}(3)程序清单4-3#includestdio.h#includeunistd.h#includefcntl.h#includesys/stat.h#includesys/types.h#includestring.h#includestdlib.hcharbuf1[]=abcdefghij;charbuf2[]=ABCDEFGHIJ;voiderr_exit(char*err_s){perror(err_s);exit(1);}intmain(void){FILE*fp;if((fp=fopen(hole.file,w))==NULL)err_exit(fileopenfail!);if(fwrite(buf1,sizeof(buf1),1,fp)!=1)err_exit(filewritebuf1error!);if(fseek(fp,40,SEEK_SET)==-1)err_exit(fseekerror!);if(fwrite(buf2,strlen(buf2),1,fp)!=1)err_exit(filewritebuf2error!);fclose(fp);}(4)程序清单4-4#includestdio.h#includeunistd.h#includefcntl.h#includesys/stat.h#includesys/types.h#includestdlib.hcharbuf1[]=abcdefghij;charbuf2[]=ABCDEFGHIJ;voiderr_exit(char*err_s){perror(err_s);exit(1);}intmain(void){intfd;if((fd=open(hole.file,O_WRONLY|O_CREAT/*|O_APPEND,0644*/))==-1)err_exit(fileopenfail!);if(write(fd,buf1,10)!=10)err_exit(filewritebuf1error!);if(lseek(fd,40,SEEK_SET)==-1)err_exit(lseekerror!);if(write(fd,buf2,10)!=10)err_exit(filewritebuf2error!);}(5)程序清单4-5#includestdio.h#includedirent.h#includesys/stat.hintmain(){DIR*pDir=opendir(“MyDirectory”);structdirent*pDirent;structstatvStat;if(pDir==NULL){printf(“Can’topenthedirectory\”MyDirectory\”);return1;}while((pDirent=readdir(pDir))!=NULL){lstat(pDirent-d_name,&vStat);if(S_ISDIR(vStat.st_mode))printf(“Directory:%s\n”,pDirent-d_name);elseprintf(“File:%s\n”,pDirent-d_name);}closedir(pDir);return0;}(6)程序清单4-6#includestdio.h#includedirent.h#includesys/stat.hintprintDir(char*path){DIR*pDir=opendir(path);structdirent*pDirent;structstatvStat;if(pDir==NULL){printf(“Can’topenthedirectory:%s”,path);return-1;}while((pDirent=readdir(pDir))!=NULL){lstat(pDirent-d_name,&vStat);if(S_ISDIR(vStat.st_mode))printf(“Directory:%s\n”,pDirent-d_name);elseprintf(“File:%s\n”,pDirent-d_name);}closedir(pDir);return0;}intmain(){char*dirPath;printf(“pleaseinputbrowsedir’spath:”);scanf(“%s”,dirPath);if(printDir(dirPath)==0)return0;elsereturn-1;}(7)程序清单4-7/*Westartwiththeappropriateheadersandthenafunction,printdir,whichprintsoutthecurrentdirectory.Itwillrecurseforsubdirectories,usingthedepthparameterisusedforindentation.*/#includeunistd.h#includestdio.h#includedirent.h#includestring.h#includesys/stat.h#includestdlib.hvoidprintdir(char*dir,intdepth){DIR*dp;structdirent*entry;structstatstatbuf;if((dp=opendir(dir))==NULL){fprintf(stderr,cannotopendirectory:%s\n,dir);return;}chdir(dir);while((entry=readdir(dp))!=NULL){lstat(entry-d_name,&statbuf);if(S_ISDIR(statbuf.st_mode)){/*Foundadirectory,butignore.and..*/if(strcmp(.,entry-d_name)==0||strcmp(..,entry-d_name)==0)continue;printf(%*s%s/\n,depth,,entry-d_name);/*Recurseatanewindentlevel*/printdir(entry-d_name,depth+4);}elseprintf(%*s%s\n,depth,,entry-d_name);}chdir(..);closedir(dp);}/*Nowwemoveontothemainfunction.*/intmain(){printf(Directoryscanof/home:\n);printdir(/home,0);printf(done.\n);exit(0);}(8)程序清单4-8/*Westartwiththeappropriateheadersandthenafunction,printdir,whichprintsoutthecurrentdirectory.Itwillrecurseforsubdirectories,usingthedepthparameterisusedforindentation.*/#includeunistd.h#includestdio.h#includedirent.h#includestring.h#includesys/stat.h#includestdlib.hvoidprintdir(char*dir,intdepth){DIR*dp;structdirent*entry;structstatstatbuf;if((dp=opendir(dir))==NULL){fprintf(stderr,cannotopendirectory:%s\n,dir);return;}c
本文标题:实验四Linux的文件处理
链接地址:https://www.777doc.com/doc-2459698 .html