linux lseek函数怎么用

作者&投稿:恭樊 (若有异议请与网页底部的电邮联系)
为什么C语言中read函数和write函数间要用lseek来调整读取顺序~

-由于程序在打开文件时文件操作指针位于文件起始位置,即偏移量0
-读取了1个字符的内容给变量c,文件指针偏移量为1
-这时如果想将c值写到文件开始位置,则需要移动文件指针到文件开始
-于是lseek就是移动文件当前指针的语句,它通知系统将文件指针移动到从文件开始位置(SEEK_SER)起的第0字节
-这个程序比较奇怪,明明打开文件时选用了0_WRONLY参数,表明这个打开是只写的,但上来就读

int main()
{
int iSrcFd = 0;
int iDesFd = 0;
CHAR acReadBuf[128] = {0};
int iReadBytes = 0;
int iWrtBytes = 0;

/* open the source file*/
iSrcFd = open("1.txt",O_RDWR | O_SYNC);
if (iSrcFd < 0)
{
return -1;
}

iReadBytes = read(iSrcFd, acReadBuf, 128);

/* open the des file */
iDesFd = open("2.txt",O_RDWR | O_SYNC);
if (iSrcFd < 0)
{
close(iSrcFd);
return -1;
}
lseek(iDesFd, 0, SEEK_END);
iWrtBytes = write(iDesFd, acReadBuf, 128);
close(iDesFd);
close(iSrcFd);
return 0;
}
lseek(iDesFd, 0, SEEK_END);就是将当前文件读写的位置移动到文件末尾

Linux的lseek函数用来控制一个打开的文件的读写位置,它的函数原型如下:
off_t lseek(int fildes,off_t offset ,int whence);
参数的用法:fildes参数为一个已打开的文件描述符;参数offset为读写位置的位移数,这个位移数是根据参数whence来确定的;whence参数分为下列三种:
SEEK_SET:表示offset用来直接设置读写位置。
SEEK_CUR:表示以目前的读写位置往后增加offset个位移量。
SEEK_END:表示将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR或SEEK_END时,参数offet允许负值出现。当lseek调用成功时返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno会存放错误代码。下面是几个使用示例:
将读写位置移到文件开头:lseek(myfile, 0, SEEK_SET);
将读写位置移到文件尾:lseek(myfile, 0, SEEK_END);
想要取得目前文件位置:off_t cur=lseek(myfile, 0, SEEK_CUR);
注意:使用lseek函数需要包含以下头文件:
#include <sys/types.h>
#include <unistd.h>