码迷,mamicode.com
首页 > 其他好文 > 详细

定位流

时间:2015-06-24 18:29:32      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

转自  http://blog.csdn.net/todd911/article/details/12909685

有三种方法可以定位流。

1.ftell函数和fseek函数

这两个函数自V7依赖就存在了。但是它们假定文件的位置可以存放在一个长整型中。
函数声明如下:
[cpp] view plaincopy
 
  1. <pre name="code" class="cpp">#include <stdio.h>  
  2. long ftell(FILE* fp); //如果成功返回当前文件位置指示,出错则返回-1.  
  3. int fseek(FILE* fp, long offset, int whence);  //如果成功则返回0,出错则返回非0值。  
  4. void rewind(FILE* fp); //定位到流的开头。</pre>  
fseek函数中的whence的值与lseek函数相同:SEEK_SET表示从文件的起始位置开始,SEEK_CUR表示从当前文件位置
开始,SEEK_END表示从文件的尾端开始。

实践:
[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2.   
  3. int main(void){  
  4.         FILE* fp;  
  5.         int result;  
  6.         int c;  
  7.   
  8.         if((fp = fopen("a.txt", "r+")) == NULL){  
  9.                 result = -1;  
  10.                 perror("fopen");  
  11.                 goto FINALLY;  
  12.         }  
  13.   
  14.         printf("position:%ld\n",ftell(fp));  
  15.   
  16.         if((c = fgetc(fp)) != -1){  
  17.                 printf("read c:%c\n",c);  
  18.         }  
  19.   
  20.         if((c = fgetc(fp)) != -1){  
  21.                 printf("read c:%c\n",c);  
  22.         }  
  23.   
  24.         printf("position:%ld\n",ftell(fp));  
  25.   
  26.         if(fseek(fp, 3, SEEK_CUR) != 0){  
  27.                 result = -1;  
  28.                 perror("fseek");  
  29.                 goto FINALLY;  
  30.         }  
  31.   
  32.         printf("position:%ld\n",ftell(fp));  
  33.   
  34.         rewind(fp);  
  35.   
  36.         printf("position:%ld\n",ftell(fp));  
  37.   
  38. FINALLY:  
  39.         if(fp != NULL){  
  40.                 fclose(fp);  
  41.         }  
  42.   
  43. return result;  
  44. }  
运行结果:
yan@yan-vm:~/apue$ cat a.txt
abcdefghijklmnopqrstuvwxyz
yan@yan-vm:~/apue$ ./a.out
position:0
read c:a
read c:b
position:2
position:5
position:0
 

2.ftello和fseeko函数

Single UNIX Specification引入了这2个函数,可以使文件偏移量不必一定使用长整型,它们使用off_t数据类型代替了长整型。
[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. off_t ftello(FILE* fp); //成功则返回当前文件的位置指示,出错则返回-1  
  3. int fseeko(FILE* fp, off_t offset, int whence);  //成功则返回0,出错返回非0值  
实践:
[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2.   
  3. int main(void){  
  4.         FILE* fp;  
  5.         int result;  
  6.         int c;  
  7.   
  8.         if((fp = fopen("a.txt", "r+")) == NULL){  
  9.                 result = -1;  
  10.                 perror("fopen");  
  11.                 goto FINALLY;  
  12.         }  
  13.   
  14.         printf("position:%ld\n",ftell(fp));  
  15.   
  16.         if((c = fgetc(fp)) != -1){  
  17.                 printf("read c:%c\n",c);  
  18.         }  
  19.   
  20.         if((c = fgetc(fp)) != -1){  
  21.                 printf("read c:%c\n",c);  
  22.         }  
  23.   
  24.         printf("position:%ld\n",ftello(fp));  
  25.   
  26.         if(fseeko(fp, 3, SEEK_CUR) != 0){  
  27.                 result = -1;  
  28.                 perror("fseek");  
  29.                 goto FINALLY;  
  30.         }  
  31.   
  32.         printf("position:%ld\n",ftell(fp));  
  33.   
  34. FINALLY:  
  35.         if(fp != NULL){  
  36.                 fclose(fp);  
  37.         }  
  38.   
  39. return result;  
  40. }  
运行结果:
yan@yan-vm:~/apue$ cat a.txt
abcdefghijklmnopqrstuvwxyz
yan@yan-vm:~/apue$ ./a.out
position:0
read c:a
read c:b
position:2
position:5
 
3.fgetpos和fsetpos函数
这2个函数是ISO C引进的,它们使用一个抽象数据类型fpos_t记录文件的位置,这种数据类型可以定义为记录一个文件
位置所需的长度。
[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. int fgetpos(FILE* restrict fp, fpos_t* restrict pos);  
  3. int fsetpos(FILE* fp, fpos_t *pos);  
这2个函数如果成功返回0,出错则返回非0值。
fgetpos将文件位置当前的值存入到pos中,以后调用fsetpos时,可以使用此值将流重新定位到该位置。
 
实践:
[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2.   
  3. int main(void){  
  4.         FILE* fp;  
  5.         int result;  
  6.         int c;  
  7.         fpos_t pos1,pos2;  
  8.   
  9.         if((fp = fopen("a.txt", "r+")) == NULL){  
  10.                 result = -1;  
  11.                 perror("fopen");  
  12.                 goto FINALLY;  
  13.         }  
  14.   
  15.         if((c = fgetc(fp)) != -1){  
  16.                 printf("read c:%c\n",c);  
  17.         }  
  18.   
  19.         if((c = fgetc(fp)) != -1){  
  20.                 printf("read c:%c\n",c);  
  21.         }  
  22.   
  23.         if(fgetpos(fp,&pos1) != 0){  
  24.                 result = -1;  
  25.                 perror("fgetpos");  
  26.                 goto FINALLY;  
  27.         }  
  28.         printf("position:%ld\n",pos1);  
  29.   
  30.         if((c = fgetc(fp)) != -1){  
  31.                 printf("read c:%c\n",c);  
  32.         }  
  33.   
  34.         if((c = fgetc(fp)) != -1){  
  35.                 printf("read c:%c\n",c);  
  36.         }  
  37.   
  38.         if(fgetpos(fp,&pos2) != 0){  
  39.                 result = -1;  
  40.                 perror("fgetpos");  
  41.                 goto FINALLY;  
  42.         }  
  43.         printf("position:%ld\n",pos2);  
  44.   
  45.         if(fsetpos(fp, &pos1) != 0){  
  46.                 result = -1;  
  47.                 perror("fsetpos");  
  48.                 goto FINALLY;  
  49.         }  
  50.   
  51.         if(fgetpos(fp,&pos2) != 0){  
  52.                 result = -1;  
  53.                 perror("fgetpos");  
  54.                 goto FINALLY;  
  55.         }  
  56.         printf("position:%ld\n",pos2);  
  57.   
  58. FINALLY:  
  59.         if(fp != NULL){  
  60.                 fclose(fp);  
  61.         }  
  62.   
  63. return result;  
  64. }  
运行结果:
yan@yan-vm:~/apue$ cat a.txt
abcdefghijklmnopqrstuvwxyz
yan@yan-vm:~/apue$ ./a.out
read c:a
read c:b
position:2
read c:c
read c:d
position:4
position:2

定位流

标签:

原文地址:http://www.cnblogs.com/QingCHOW/p/4598189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!