Linux编程学习之文件IO篇-lseek函数

来源:互联网 发布:python 金融 pdf 编辑:程序博客网 时间:2024/05/16 06:53

概念:

每打开一个文件都有一个与其相关联的“当前文件偏移量”(current file offset),用以度量从文件开始处计算的字节数。通常的读、写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数。

按照系统默认的情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0。

而lseek函数就可以显式地为一个打开的文件设置偏移量

 

lseek函数:

头文件 #include <unistd.h>

off_t lseek(int fd , off_t offset , intwhence );

返回值:若成功,返回新的文件偏移量;若出错,返回-1,并将errno设置为 ESPIPE;

l  关于参数offset和whence的说明

1.        若whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节

2.        若whence是SEET_CUR,则将该文件的偏移量设置为其当前值加offset,offset可为正或负;

3.        若whence是SEET_END,则将该文件的偏移量设置为文件的长度加offset,offset可为正或负。(就是文件的末尾)

如果lseek函数执行成功则返回新的文件偏移量,为此可以用下面的方式打开文件的当前偏移量:

off_t                   currpos;

currpos    =  lseek(fd , 0 , SEEK_CUR);

这里说明一点,因为lseek返回的文件偏移量有可能是负值,所以在对其返回结果进行比较的时候应当谨慎,不要测试它是否小于0,而是测试它是不是等于-1;

l  lseek函数仅将当前的文件偏移量记录在内核中,它并不会引起任何的I/O操作;然后,该偏移量用于下一个读写操作;

l  文件的偏移量是可以大于文件的当前长度的,在这种情况下,对该文件的下一次写操作将加长该文件,并在文件中构成空洞,这一点是被允许的。位于文件中没有被写过的字节都被读为0(当然这不是是不会占用磁盘块的)

引用书中原话(当然大部分都是书上的内):文件中的空洞并不要求在磁盘上占用存储区。具体的处理方式与文件系统的实现有关,当定位到超出文件尾端之后写时,对于新写的数据需要分配磁盘块,但是对于原文间尾端和新开始写位置之间的空洞部分则不需要分配磁盘块

一些关于lseek的使用:

获取文件大小:

1.  void main()  

2.  {  

3.      int add_len = 1024*8;  

4.      int fd=open("test.txt",O_RDWR);  

5.      if(fd == -1)  

6.      {  

7.          perror("open test.txt");  

8.          exit(-1);  

9.      }  

10.     lseek(fd,add_len-1,SEEK_END);  

11.     write(fd,"0",1);  

12.   

13. }  

获取文件长度:

14. void main()  

15. {  

16.     int fd=open("test.txt",O_RDWR);  

17.     if(fd == -1)  

18.     {  

19.         perror("open test.txt");  

20.         exit(-1);  

21.     }  

22.     printf("file len:%d \n",lseek(fd,0,SEEK_END));  

23.     close(fd);  

24.   

25. }  

有错误或者不完美的地方还请大家指导。
原创粉丝点击