文件流定位

参考 《Linux高级程序设计》

在对文件流进行操作时,有一个指针指向流的当前读写位置,如果希望从特殊位置读写,则需要通过函数修改当前读写位置。

(1) 返回当前读写位置

ftell函数返回流的当前读写位置距离文件开始的字节数。函数声明如下:

1 /*Return the current position of STREAM*/
2 extern long int ftell(FILE* _stream)

如果执行成功,将返回当前指针位置距离文件开始的字节数,如果失败,返回-1。

 

(2) 修改当前读写位置

使用fseek函数可以修改当前读写位置。函数声明如下:

1 /*Seek to a certain position on STREAM*/
2 extern int fseek(FILE* _stream,long int _off,int _whence)

此函数第一个参数为操作的流对象,第二个参数为针对第三个参数(修改基准)的偏移位置,第三个参数为修改位置的基准,共有三个基准

#define SEEK_SET 0  //文件开始位置

#define SEEK_CUR 1  //当前位置

#define SEEK_END 2  //文件结束位置

如果函数执行成功,将返回0,否则返回-1.

 

(3) 重置当前读写位置

当执行完一次操作,为了实现第二次操作时,需要调用rewind函数将读写指针重置到文件开始位置。函数声明如下:

1 /*Rewind to the beginning of STREAM*/
2 extern void rewind(FILE* _stream)

 

一个小代码实例,实现获取某个文件的大小。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <memory.h>
 4 #include <stdlib.h>
 5 using namespace std;
 6 
 7 int main(int argc,char* argv[])
 8 {
 9     int n=0;
10     FILE* fp=NULL;
11     if((fp=fopen(argv[1],"r"))==NULL)
12     {
13         perror("fopen");
14         exit(EXIT_FAILURE);
15     }
16     if(fseek(fp,0,SEEK_END)!=0)    //设置当前读写位置为文件尾
17     {
18         perror("fseek");
19         exit(EXIT_FAILURE);
20     }
21     if((n=ftell(fp))==-1)    //读取当前读写位置的偏移值
22     {
23         perror("ftell");
24         exit(EXIT_FAILURE);
25     }
26     printf("n=%d\n",n);
27     //用ls命令验证文件大小
28     printf("This is ls output:\n");
29     execl("/bin/ls","ls","-l",argv[1],(char*)0);    //运行ls -l命令查看文件大小来验证
30     fclose(fp);
31     return 0;
32 }

 

 

posted on 2013-01-30 17:03  kkzone  阅读(587)  评论(0编辑  收藏  举报