linux 使用lseek函数来获取文件大小

原文链接:https://blog.csdn.net/xiaokuang5020/article/details/74644866

一、获取文件大小

 

 
  1. /*测得文件大小*/

  2. int filelen;

  3. int fd;

 
  1.  
  2. int filelen= lseek(fd,0L,SEEK_END);

  3. lseek(fd,0L,SEEK_SET);

  4. printf("file size is %d\n",filelen);

 

二、lseek使用说明

表头文件
#include<sys/types.h>
#include<unistd.h>


定义函数
off_t lseek(int filde,off_t offset ,int whence);

 

 

EEK_SET 将读写位置指向文件头后再增加offset个位移量。

SEEK_CUR 以目前的读写位置往后增加offset个位移量。

SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。

下列是较特别的使用方式:

1) 欲将读写位置移到文件开头时:

lseek(int fildes,0,SEEK_SET);

2) 欲将读写位置移到文件尾时:

lseek(int fildes,0,SEEK_END);

3) 想要取得目前文件位置时:

lseek(int fildes,0,SEEK_CUR);

 

 

返回值
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。
可能设置erron的错误代码:
EBADF: fildes不是一个打开的文件描述符。
ESPIPE:文件描述符被分配到一个管道、套接字或FIFO。
EINVAL:whence取值不当。

 

代码列子:

 

 
  1. #define BUFFER_SIZE 1024

  2. int main(int argc,char **argv)

  3. {

  4. int readfd, writefd;

  5. long filelen=0;

  6. int ret=1;

  7. char buffer[BUFFER_SIZE];

  8. char *ptr;

  9.  
  10. /*打开源文件*/

  11. if((readfd=open("test.txt", O_RDONLY|O_CREAT)) == -1)

  12. {

  13. printf("Open Error\n");

  14. exit(1);

  15. }

  16.  
  17. /*创建目的文件*/

  18. if((writefd=open("dest.txt", O_WRONLY|O_CREAT)) == -1)

  19. {

  20. printf("Open Error\n");

  21. exit(1);

  22. }

  23.  
  24. /*测得文件大小*/

  25. filelen= lseek(readfd,0L,SEEK_END);

  26. lseek(readfd,0L,SEEK_SET);

  27. printf("read file size is %d\n",filelen);

  28.  
  29. /*进行文件拷贝*/

  30. while(ret)

  31. {

  32. ret= read(readfd, buffer, BUFFER_SIZE);

  33. if(ret==-1)

  34. {

  35. printf("read Error\n");

  36. exit(1);

  37. }

  38. write(writefd, buffer, ret);

  39. filelen-=ret;

  40. bzero(buffer,BUFFER_SIZE);

  41. }

  42.  
  43. close(readfd);

  44. close(writefd);

  45. exit(0);

  46. }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,`mmap`函数用于在进程的虚拟地址空间中创建一个新的映射区域或者修改已有映射区域的属性。它可以将文件或其他设备映射到内存中,也可以用于创建匿名映射。 下面是`mmap`函数的原型: ```c #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); ``` 参数说明: - `addr`:映射区域的首地址,一般传入`NULL`,让系统自动选择合适的地址。 - `length`:映射区域的长度。 - `prot`:映射区域的保护模式,可以是`PROT_READ`、`PROT_WRITE`、`PROT_EXEC`的组合。 - `flags`:映射区域的标志,可以是`MAP_SHARED`、`MAP_PRIVATE`、`MAP_ANONYMOUS`等。 - `fd`:要映射的文件描述符,如果不需要映射文件,则传入`-1`。 - `offset`:要映射文件的偏移量。 调用成功时,`mmap`函数返回映射区域的起始地址,失败时返回`MAP_FAILED`。 以下是一个简单的示例,演示了如何使用`mmap`函数将文件映射到内存中: ```c #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> int main() { int fd; char *data; fd = open("file.txt", O_RDWR); if (fd == -1) { perror("open"); exit(1); } // 获取文件大小 off_t file_size = lseek(fd, 0, SEEK_END); if (file_size == -1) { perror("lseek"); exit(1); } // 将文件映射到内存中 data = mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (data == MAP_FAILED) { perror("mmap"); exit(1); } // 使用映射的内存进行操作 printf("%s\n", data); // 解除内存映射 if (munmap(data, file_size) == -1) { perror("munmap"); exit(1); } close(fd); return 0; } ``` 这个示例中,首先通过`open`函数打开一个文件,然后使用`lseek`函数获取文件的大小。接下来,使用`mmap`函数将文件映射到内存中,并返回映射区域的起始地址。最后,通过使用映射的内存进行操作,完成后使用`munmap`函数解除内存映射。 需要注意的是,`mmap`函数将文件映射到内存中后,对内存的操作将直接反映到文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值