分类: C/C++
2013-11-29 14:55:40
lseek可以改变文件的偏移量
off_t lseek(int filedes,off_t offset,int whence);
第三个参数:为SEEK_SET 文件开始出偏移offset个字节
为SEEK_CUR 当前位置 为SEEK_END文件末尾长度加上offset
可以把文件理解为一个内存块,内存块的读写需要一个指针操作,指针来回在内存块中移动,就可以读写某个位置的数据.
文件的偏移量相当于这个指针的位置
文件如果映射到内存的话,就是一个内存块,读写内存块是需要偏移的
lseek仅将当前的文件位移量记录在内核内,它并不引起任何I/O操作。然后,该位移量用于下一个读或写操作。
文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空调,这
一点是允许的。位于文件中但没有写过的字节都被读为0.
ssize_t write(int fd,const void *buf,size_t count);
参数:fd:要进行写操作的文件描述符 buf-需要输出的缓冲区 count-最大输出字节计数
ssize_t read(int fd,const void*buf,size_t count);
参数:fd-要进行读操作的文件描述符 buf-需要读入的缓冲区 count-最大读入字节计数
char buf[]="aabbcc";sizeof(buf) 返回4
char buf[6]="aabbcc";sizeof(buf) 返回6
查看文件大小 ls -l file.hole
查看文件实际内容 od -c file.hole
实例:
#include
#include "ourhdr.h"
#define FILE_MODE 0644
char buf1[]="abcdefghij";
char buf2[]="ABCDEFGHIJ";
int main(void)
{
char buf3[20];
int fd;
if((fd=creat("file.hole",FILE_MODE))<0) //只能写不能读
perror("creat error");
if(write(fd,buf1,10)!=10)
perror("buf1 write error");
if(lseek(fd,40,SEEK_SET)==-1)
perror("lseek error");
/* offset now=40*/
if(write(fd,buf2,10)!=10)
perror("buf2 write error");
/*offset now =50*/
fd=open("file.hole",O_RDONLY); //读的时候,一定要open
if(read(fd,buf3,20)==-1)
perror("buf3 read error");
printf("\n%s\n",buf3);
exit(0);
}