博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
定位流
阅读量:5943 次
发布时间:2019-06-19

本文共 4502 字,大约阅读时间需要 15 分钟。

转自  

有三种方法可以定位流。

1.ftell函数和fseek函数

这两个函数自V7以来就存在了。但是它们假定文件的位置可以存放在一个长整型中。
函数声明如下:
#include 
long ftell(FILE* fp); //如果成功返回当前文件位置指示,出错则返回-1. int fseek(FILE* fp, long offset, int whence); //如果成功则返回0,出错则返回非0值。 void rewind(FILE* fp); //定位到流的开头  
fseek函数中的whence的值与lseek函数相同:SEEK_SET表示从文件的起始位置开始,SEEK_CUR表示从当前文件位置开始,SEEK_END表示从文件的尾端开始。
实践:
#include 
int main(void){ FILE* fp; int result; int c; if((fp = fopen("a.txt", "r+")) == NULL){ result = -1; perror("fopen"); goto FINALLY; } printf("position:%ld\n",ftell(fp)); if((c = fgetc(fp)) != -1){ printf("read c:%c\n",c); } if((c = fgetc(fp)) != -1){ printf("read c:%c\n",c); } printf("position:%ld\n",ftell(fp)); if(fseek(fp, 3, SEEK_CUR) != 0){ result = -1; perror("fseek"); goto FINALLY; } printf("position:%ld\n",ftell(fp)); rewind(fp); printf("position:%ld\n",ftell(fp)); FINALLY: if(fp != NULL){ fclose(fp); } return result; }
运行结果:
$ cat a.txt
abcdefghijklmnopqrstuvwxyz
$ ./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数据类型代替了长整型。
#include 
off_t ftello(FILE* fp); //成功则返回当前文件的位置指示,出错则返回-1 int fseeko(FILE* fp, off_t offset, int whence); //成功则返回0,出错返回非0值
实践:
#include 
int main(void){ FILE* fp; int result; int c; if((fp = fopen("a.txt", "r+")) == NULL){ result = -1; perror("fopen"); goto FINALLY; } printf("position:%ld\n",ftell(fp)); if((c = fgetc(fp)) != -1){ printf("read c:%c\n",c); } if((c = fgetc(fp)) != -1){ printf("read c:%c\n",c); } printf("position:%ld\n",ftello(fp)); if(fseeko(fp, 3, SEEK_CUR) != 0){ result = -1; perror("fseek"); goto FINALLY; } printf("position:%ld\n",ftell(fp)); FINALLY: if(fp != NULL){ fclose(fp); } return result; }

 

运行结果:
$ cat a.txt
abcdefghijklmnopqrstuvwxyz
$ ./a.out
position:0
read c:a
read c:b
position:2
position:5
 
3.fgetpos和fsetpos函数
这2个函数是ISO C引进的,它们使用一个抽象数据类型fpos_t记录文件的位置,这种数据类型可以定义为记录一个文件位置所需的长度。
#include 
int fgetpos(FILE* restrict fp, fpos_t* restrict pos); int fsetpos(FILE* fp, fpos_t *pos);
这2个函数如果成功返回0,出错则返回非0值。fgetpos将文件位置当前的值存入到pos中,以后调用fsetpos时,可以使用此值将流重新定位到该位置。 
实践:
#include 
int main(void){ FILE* fp; int result; int c; fpos_t pos1,pos2; if((fp = fopen("a.txt", "r+")) == NULL){ result = -1; perror("fopen"); goto FINALLY; } if((c = fgetc(fp)) != -1){ printf("read c:%c\n",c); } if((c = fgetc(fp)) != -1){ printf("read c:%c\n",c); } if(fgetpos(fp,&pos1) != 0){ result = -1; perror("fgetpos"); goto FINALLY; } printf("position:%ld\n",pos1); if((c = fgetc(fp)) != -1){ printf("read c:%c\n",c); } if((c = fgetc(fp)) != -1){ printf("read c:%c\n",c); } if(fgetpos(fp,&pos2) != 0){ result = -1; perror("fgetpos"); goto FINALLY; } printf("position:%ld\n",pos2); if(fsetpos(fp, &pos1) != 0){ result = -1; perror("fsetpos"); goto FINALLY; } if(fgetpos(fp,&pos2) != 0){ result = -1; perror("fgetpos"); goto FINALLY; } printf("position:%ld\n",pos2); FINALLY: if(fp != NULL){ fclose(fp); } return result; }
运行结果:
$ cat a.txt
abcdefghijklmnopqrstuvwxyz
$ ./a.out
read c:a
read c:b
position:2
read c:c
read c:d
position:4
position:2

转载于:https://www.cnblogs.com/QingCHOW/p/4598189.html

你可能感兴趣的文章
Myeclipse或Eclipse中搭建Easyui环境
查看>>
(转)数字格式化函数:Highcharts.numberFormat()
查看>>
我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
查看>>
CCNA2.0笔记_ipv6的EIGRP
查看>>
最短路径算法整理(二)
查看>>
java的基本数据类型
查看>>
Android IOS WebRTC 音视频开发总结(二四)-- p2p调用堆栈
查看>>
Java面向对象基础二
查看>>
PR使用技巧
查看>>
项目总结笔记系列 Social Hub KT Session1
查看>>
EasyMock 使用方法与原理剖析--转载
查看>>
WPF中的CheckBox的_ (underscore / 下划线)丢失
查看>>
unity 查看prefab层次
查看>>
正则表达式匹配数字
查看>>
前端模块化
查看>>
QIBO CMS SQL Injection Via Variable Uninitialization In \member\special.php
查看>>
二维数组---模拟斗地主
查看>>
【转】(DT系列六)devicetree中数据和 struct device有什么关系
查看>>
【前端性能】必须要掌握的原生JS实现JQuery
查看>>
mysql系统变量
查看>>