(十)lseek函数的介绍和使用
2016-12-29 23:53
141 查看
每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通常读写多少个字节就会将读写位置往后移多少个字节。但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。lseek和标准I/O库的fseek函数类似,可以移动当前读写位置(或者叫偏移量)。
参数offset和whence的含义和fseek函数完全相同。只不过第一个参数换成了文件描述符。和fseek一样,偏移量允许超过文件末尾,这种情况下对该文件的下一次写操作将延长文件,中间空洞的部分读出来都是0。
若lseek成功执行,则返回新的偏移量,因此可用以下方法确定一个打开文件的当前偏移量:
这种方法也可用来确定文件或设备是否可以设置偏移量,常规文件都可以设置偏移量,而设备一般是不可以设置偏移量的。如果设备不支持lseek,则lseek返回-1,并将errno设置为ESPIPE。注意fseek和lseek在返回值上有细微的差别,fseek成功时返回0失败时返回-1,要返回当前偏移量需调用ftell,而lseek成功时返回当前偏移量失败时返回-1。
一个小例子:(先要创建一个abc文件)
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);
参数offset和whence的含义和fseek函数完全相同。只不过第一个参数换成了文件描述符。和fseek一样,偏移量允许超过文件末尾,这种情况下对该文件的下一次写操作将延长文件,中间空洞的部分读出来都是0。
若lseek成功执行,则返回新的偏移量,因此可用以下方法确定一个打开文件的当前偏移量:
off_t currpos; currpos = lseek(fd, 0, SEEK_CUR);
这种方法也可用来确定文件或设备是否可以设置偏移量,常规文件都可以设置偏移量,而设备一般是不可以设置偏移量的。如果设备不支持lseek,则lseek返回-1,并将errno设置为ESPIPE。注意fseek和lseek在返回值上有细微的差别,fseek成功时返回0失败时返回-1,要返回当前偏移量需调用ftell,而lseek成功时返回当前偏移量失败时返回-1。
一个小例子:(先要创建一个abc文件)
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int fd = open("abc",O_RDWR); if(fd < 0) { perror("open abc"); exit(-1); a8d0 } //拓展文件大小,用od -tcx abc命令查看结果 lseek(fd, 0X1000,SEEK_SET); write(fd, "a", 1); //用lseek获取文件大小 printf("abc's size:%d\n",(int)lseek(fd,0,SEEK_END)); close(fd); return 0; }
相关文章推荐
- 存储过程介绍及asp存储过程的使用
- 钩子技术介绍及函数使用
- SQL SERVER 函数使用方法介绍
- MYSQL初学者使用指南与介绍
- JDOM 介绍及使用指南
- MYSQL初学者使用指南与介绍
- tiles使用介绍
- ·搜索引擎Nutch介绍(1)-使用Nutch
- Ant介绍以及基本使用指南
- 钩子技术介绍及函数使用
- 存储过程介绍及asp存储过程的使用
- 存储过程介绍及asp存储过程的使用
- Ant介绍以及基本使用指南
- 存储过程介绍及asp存储过程的使用 选择自 aedn 的 Blog
- MattPowell介绍了如何在服务器端使用异步Web方法,来创建高性能的 Microsoft ASP.NET Web 服务
- WebForm ControlManager控件的DLL已经上传了!下面是控件使用介绍.
- PHP PEAR中Database(DB)使用介绍
- Ant介绍以及基本使用指南
- MYSQL初学者使用指南与介绍
- Ant介绍以及基本使用指南