Linux lseek函数的使用详解
注:如果文章内容有误,请留言指出,谢谢合作。
名字
Name:lseek-repositionread/writefileoffset
lseek函数的作用是用来重新定位文件读写的位移。
头文件以及函数声明
#include#include off_tlseek(intfd,off_toffset,intwhence);
offset为正则向文件末尾移动(向前移),为负数则向文件头部(向后移)。
描述
lseek()repositionsthefileoffsetoftheopenfiledescriptionassociatedwiththefiledescriptorfdtotheargumentoffsetaccordingtothedirectivewhenceasfollows:
SEEK_SETThefileoffsetissettooffsetbytes.
SEEK_CURThefileoffsetissettoitscurrentlocationplusoffsetbytes.
SEEK_ENDThefileoffsetissettothesizeofthefileplusoffsetbytes.
lseek()allowsthefileoffsettobesetbeyondtheendofthefile(butthisdoesnotchangethesizeofthefile).Ifdataislaterwrittenatthispoint,subsequentreadsofthedatainthegap(a“hole”)returnnullbytes(‘\0')untildataisactuallywrittenintothegap.
lseek()函数会重新定位被打开文件的位移量,根据参数offset以及whence的组合来决定:
SEEK_SET:
从文件头部开始偏移offset个字节。
SEEK_CUR:
从文件当前读写的指针位置开始,增加offset个字节的偏移量。
SEEK_END:
文件偏移量设置为文件的大小加上偏移量字节。
测试代码:
#include#include #include #include #include #include #defineBUFFER_SIZE1024 #defineSRC_FILE_NAME"src_file" #defineDEST_FILE_NAME"dest_file" //根据传入的参数来设置offset #defineOFFSET(atoi(args[1])) intmain(intargc,char*args[]){ intsrc_file,dest_file; unsignedcharbuff[BUFFER_SIZE]; intreal_read_len,off_set; if(argc!=2){ fprintf(stderr,"Usage:%soffset\n",args[0]); exit(-1); } src_file=open(SRC_FILE_NAME,O_RDONLY); dest_file=open(DEST_FILE_NAME,O_WRONLY|O_CREAT,S_IREAD|S_IWRITE);//owner权限:rw if(src_file<0||dest_file<0){ fprintf(stderr,"Openfileerror!\n"); exit(1); } off_set=lseek(src_file,-OFFSET,SEEK_END);//注意,这里对offset取了相反数 printf("lseek()reposisitonthefileoffsetofsrc_file:%d\n",off_set); while((real_read_len=read(src_file,buff,sizeof(buff)))>0){ write(dest_file,buff,real_read_len); } close(dest_file); close(src_file); return0; }
结果解析
观察offset以及dest_file和src_file文件的大小不难看出:程序通过lseek函数将src_file文件指针重新定位到文件末尾+offset(注意,本程序对offset取了相反数,即文件末尾+(-offset))处,然后从文件末尾+offset处开始向前复制文件到dest_file中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。