文件流定位
参考 《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 }