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的使用:
l 获取文件大小:
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. }
l 获取文件长度:
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. }
- Linux编程学习之文件IO篇-lseek函数
- Linux编程学习之文件IO篇-文件IO的五个函数
- 文件IO---lseek、fcntl函数
- linux文件函数-lseek
- Linux系统函数学习之lseek
- Linux 文件IO函数(open/close/read/write/lseek)
- linux编程学习笔记(八) 文件 定位 lseek pread pwrite
- linux编程学习笔记(八) 文件 定位 lseek pread pwrite
- Linux文件编程之【系统调用】—— lseek()
- linux之lseek函数解析
- Linux C编程学习笔记(3):read、write、lseek函数及文件读写和文件读写指针的移动操作
- LinuxC编程之IO-通过lseek对文件进行读写
- 文件IO lseek
- Linux 文件IO — open、read、write 、lseek
- Linux文件IO-open,write,read,lseek,close
- Linux ---lseek() 函数
- Linux ---lseek() 函数
- Linux ---lseek() 函数
- 简单谈谈Collection集合和Map集合
- Uva4730 Kingdom (并查集+线段树)
- 学习面向对象第三节
- XAMPP/MYSQL 忘记root密码
- 再识智能指针
- Linux编程学习之文件IO篇-lseek函数
- 1007. Maximum Subsequence Sum
- Java的循环部分
- 获取计算机网络相关信息
- windows下mysql配置文件my.ini的位置
- 视频播放--MovieTexture和VideoPlayer
- HK Missing Numbers
- 使用Python抓取我爱我家二手房数据
- PAT (Advanced Level) Practise 1053 Path of Equal Weight (30)