Chinaunix首页 | 论坛 | 博客
  • 博客访问: 74277
  • 博文数量: 28
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-29 14:47
文章存档

2014年(13)

2013年(15)

我的朋友

分类: 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);
}

阅读(965) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:access和umask函数

给主人留下些什么吧!~~