Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543486
  • 博文数量: 67
  • 博客积分: 1625
  • 博客等级: 上尉
  • 技术积分: 1053
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-04 14:40
文章分类

全部博文(67)

文章存档

2012年(67)

分类: LINUX

2012-04-12 08:21:15

lseek计算文件长度

作者:kangear

源代码:


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<sys/types.h>
  4. #include<sys/stat.h>
  5. #include<fcntl.h>
  6. #include<unistd.h>

  7. int main(int argc,char *argv[])
  8. {
  9.     int fd,length;
  10.     if(argc<2)
  11.     {
  12.        puts("Please input the open file pathname!\n");
  13.       exit(1);
  14.     }
  15.     
  16.     if((fd=open(argv[1],O_RDONLY))<0)
  17.     {
  18.      perror("Open file failure!");
  19.      exit(1);
  20.     }

  21.     if((length = lseek(fd,0,SEEK_END))<0)
  22.     {
  23.        perror("lseek file failure!");
  24.     }
  25.         
  26.     printf("The file's length is %d\n",length);
  27.     close(fd);
  28.     exit(0);
  29. }

 lseek源程序.rar   
 

说明:

fd所指文件:  s1

s1内容为    1234567890

源代码      lseek.c

编译好      lseek

截图

运行成功时:

 

不输入s1时:(pathname)

删除s1之后运行:

不知道如何让lseek失败,所以没有进行lseek失败测试:

()

 

 

程序的第23行为功能实现函数。

附上lseek用法:

 

#include

off_t  lseek (int filedes, off_t offset, int whence);

                                    返回值:若成功则放回新的文件偏移量,若出错则返回-1

 

 

疑惑的是:计算结果比实际多一位,这个问题和好解决的但是就是把offse变为1,但是老师讲的是0;我也理解了,做的时候却不一样,很是郁闷……

 

(下一步要解决 perrorfprintf的区别)

阅读(11005) | 评论(6) | 转发(1) |
给主人留下些什么吧!~~

GFree_Wind2012-04-16 13:43:33

kangear:Unix下不是不区分 二进制不二进制吗?请指教…….....
你的精神很好!我还真忘了unix对于文件,并不区分二进制还是文本。
在看你的博文的时候,没有发现你注明unix环境——虽然使用的lseek,并不是C库的fseek。

所以,你的代码没有什么错误。可是作为一个程序来说,尽量不要利用环境的特性,而是使用一个同样的方法。

kangear2012-04-16 12:36:10

GFree_Wind: 计算文件长度,最好不要使用lseek,fseek这种方法,在二进制方式打开的文件,有可能会有问题。

最好使用fstat,直接得到文件大小.....
Unix下不是不区分 二进制不二进制吗?请指教……

GFree_Wind2012-04-16 11:42:18

计算文件长度,最好不要使用lseek,fseek这种方法,在二进制方式打开的文件,有可能会有问题。

最好使用fstat,直接得到文件大小

重返人生2012-04-14 12:13:17

返回0值~~

☆彼岸★花开2012-04-14 12:01:16

理论上是0,不懂的可以再上网找找~~