linux lseek函数怎么用?Linux中的系统调用lseek为什么会有两个头文件

linux lseek函数怎么用

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》

Linux中的系统调用lseek为什么会有两个头文件

lseek 定义在unistd.h中
lseek第三个参数的具体值被定义成Macro ,在 stdio.h中定义如果你调用lseek,要用到诸如SEEK_SET, SEEK_CUR之类的marco,你两个头文件都需要应用,除非你直接给出相关的整型值

函数“lseek”的参数太少

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》

如何通过使用lseek获取文件的长度

获取文件长度先把文件指针移动到文件结尾,然后得出文件指针相对于文件头的偏移量,这个偏移量就是以字节计算的文件长度:
unsigned long int len; //用len存储文件长度
fseek(pf,0,SEEK_END); //移动到文件尾 ,假设文件指针变量为pf
len=ftell(pf); //ftell函数返回当前文件指针相对于文件头的偏移量,文件指针位于文件尾的话,那返回值就相当于文件长度了

怎样用lseek()函数将一个文件的内容附加到另一个文件上

int main()
{
int iSrcFd = 0;
int iDesFd = 0;
CHAR acReadBuf = {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);就是将当前文件读写的位置移动到文件末尾

问一个关于lseek函数的效率问题

lseek是库函数。
库函数就是C++最基本的函数,也就是说没有这些东西无法定义C++。
C++的制定标准,并不决定库函数的底层是如何实现的,主要决定实现结果和大致逻辑。
所以,对于不同系统不同型号机器的lseek,它的实现是不一样的。
在大多数系统中,lssek的执行只是改变一个内存中的值。计算机读取磁盘很慢,而内存很快,于是操作系统在内存中会事先保存好多值,当下一个读盘周期开始的时候,计算机会以最优化的读取顺序读取内存中设置的磁盘位置,lssek改变的就是那个位置。
所以耗时依赖你的系统和硬件,10000 比100未必慢

linux系统中用lseek()生成的空洞文件有什么用

空洞文件很有用的,看看迅雷下载的文件,在未下载完成时就已经占据了全部文件大小的空间,这时候就是空洞文件。下载时如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。
在开发过程中有时候需要为某个文件快速地分配固定大小的磁盘空间
(1)可以让文件尽可能的占用连续的磁盘扇区,减少后续写入和读取文件时的磁盘寻道开销;
(2)迅速占用磁盘空间,防止使用过程中所需空间不足。
(3)后面再追加数据的话,不会需要改变文件大小,所以后面将不涉及metadata的修改。
lseek()系统调用
功能说明:
通过指定相对于开始位置、当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置
函数原型:
#include 《sys/types.h》
#include 《unistd.h》
off_t lseek(int fd, off_t offset, int whence);
参数说明:
fd:文件描述符
offset:偏移量,该值可正可负,负值为向前移
whence:搜索的起始位置,有三个选项:
(1).SEEK_SET: 当前位置为文件的开头,新位置为偏移量大小
(2).SEEK_CUR: 当前位置为文件指针位置,新位置为当前位置加上偏移量大小
(3).SEEK_END: 当前位置为文件结尾,新位置为偏移量大小
返回值:文件新的偏移值

lseek函数出现空洞的返回值是什么啊

函数名: lseek
  功 能: 移动文件读/写指针
  用 法: long lseek(int handle, long offset, int fromwhere);
  所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。
  使用 lseek 函数可以改变文件的 cfo 。
  lseek 的以下用法返回当前的偏移量:
  off_t currpos;
  currpos = lseek(fd, 0, SEEK_CUR);
  这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为 ESPIPE。
  对于普通文件(regular file),cfo 是一个非负整数。但对于特殊设备,cfo 有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。
  lseek 仅将 cfo 保存于内核中,不会导致任何 I/O 操作。这个 cfo 将被用于之后的读写操作。
  如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。
编辑本段
程序例
  #include 《stdio.h》
  #include 《stdlib.h》
  #include 《string.h》
  #include 《unistd.h》
  #include 《sys/types.h》
  #include 《fcntl.h》
  int main(void)
  {
  int handle;
  char msg = “This is a test“;
  char ch;
  /* create a file */
  handle = open(“TEST.$$$“, O_CREAT | O_RDWR, S_IREAD | S_IWRITE);
  /* write some data to the file */
  write(handle, msg, strlen(msg));
  /* seek to the begining of the file */
  lseek(handle, 0L, SEEK_SET);
  /* reads chars from the file until we hit EOF */
  do
  {
  read(handle, &ch, 1);
  printf(“%c“, ch);
  } while (!eof(handle));
  close(handle);
  return 0;
  }

| 本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。 如果侵犯了你的权益请来信告知我们删除。邮箱:973000716@qq.com