定位流

转自  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. int main(void){
  3. FILE* fp;
  4. int result;
  5. int c;
  6. if((fp = fopen("a.txt", "r+")) == NULL){
  7. result = -1;
  8. perror("fopen");
  9. goto FINALLY;
  10. }
  11. printf("position:%ld\n",ftell(fp));
  12. if((c = fgetc(fp)) != -1){
  13. printf("read c:%c\n",c);
  14. }
  15. if((c = fgetc(fp)) != -1){
  16. printf("read c:%c\n",c);
  17. }
  18. printf("position:%ld\n",ftell(fp));
  19. if(fseek(fp, 3, SEEK_CUR) != 0){
  20. result = -1;
  21. perror("fseek");
  22. goto FINALLY;
  23. }
  24. printf("position:%ld\n",ftell(fp));
  25. rewind(fp);
  26. printf("position:%ld\n",ftell(fp));
  27. FINALLY:
  28. if(fp != NULL){
  29. fclose(fp);
  30. }
  31. return result;
  32. }

运行结果:

[email protected]:~/apue$ cat a.txt
abcdefghijklmnopqrstuvwxyz
[email protected]:~/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. int main(void){
  3. FILE* fp;
  4. int result;
  5. int c;
  6. if((fp = fopen("a.txt", "r+")) == NULL){
  7. result = -1;
  8. perror("fopen");
  9. goto FINALLY;
  10. }
  11. printf("position:%ld\n",ftell(fp));
  12. if((c = fgetc(fp)) != -1){
  13. printf("read c:%c\n",c);
  14. }
  15. if((c = fgetc(fp)) != -1){
  16. printf("read c:%c\n",c);
  17. }
  18. printf("position:%ld\n",ftello(fp));
  19. if(fseeko(fp, 3, SEEK_CUR) != 0){
  20. result = -1;
  21. perror("fseek");
  22. goto FINALLY;
  23. }
  24. printf("position:%ld\n",ftell(fp));
  25. FINALLY:
  26. if(fp != NULL){
  27. fclose(fp);
  28. }
  29. return result;
  30. }

运行结果:

[email protected]:~/apue$ cat a.txt
abcdefghijklmnopqrstuvwxyz
[email protected]:~/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. int main(void){
  3. FILE* fp;
  4. int result;
  5. int c;
  6. fpos_t pos1,pos2;
  7. if((fp = fopen("a.txt", "r+")) == NULL){
  8. result = -1;
  9. perror("fopen");
  10. goto FINALLY;
  11. }
  12. if((c = fgetc(fp)) != -1){
  13. printf("read c:%c\n",c);
  14. }
  15. if((c = fgetc(fp)) != -1){
  16. printf("read c:%c\n",c);
  17. }
  18. if(fgetpos(fp,&pos1) != 0){
  19. result = -1;
  20. perror("fgetpos");
  21. goto FINALLY;
  22. }
  23. printf("position:%ld\n",pos1);
  24. if((c = fgetc(fp)) != -1){
  25. printf("read c:%c\n",c);
  26. }
  27. if((c = fgetc(fp)) != -1){
  28. printf("read c:%c\n",c);
  29. }
  30. if(fgetpos(fp,&pos2) != 0){
  31. result = -1;
  32. perror("fgetpos");
  33. goto FINALLY;
  34. }
  35. printf("position:%ld\n",pos2);
  36. if(fsetpos(fp, &pos1) != 0){
  37. result = -1;
  38. perror("fsetpos");
  39. goto FINALLY;
  40. }
  41. if(fgetpos(fp,&pos2) != 0){
  42. result = -1;
  43. perror("fgetpos");
  44. goto FINALLY;
  45. }
  46. printf("position:%ld\n",pos2);
  47. FINALLY:
  48. if(fp != NULL){
  49. fclose(fp);
  50. }
  51. return result;
  52. }

运行结果:
[email protected]:~/apue$ cat a.txt
abcdefghijklmnopqrstuvwxyz
[email protected]:~/apue$ ./a.out
read c:a
read c:b
position:2
read c:c
read c:d
position:4
position:2

时间: 2024-08-06 01:20:37

定位流的相关文章

定位流之z-index属性

1.固定定位是脱离标准流的,不会占用标准流的空间 2.和绝对定位有点像,也不区分行内块级元素 3.类似于前面学的背景关联方式(让某个背景图片不随滚动而滚动)让某个元素不随着滚动条的滚动而滚动 ie6不支持固定定位 定义:默认情况所以元素的z-index属性是0;作用是专门用于控制定位流元素的覆盖关系的默认情况下定位流的元素会盖住标准流的元素后面编写的定位流会盖住前面编写的定位流元素在企业开发中:可能不止一次用了定位流,而根据定位流的性质,很有可能后面的元素会盖住前面的元素从而影响整个布局,为了解

定位流和浮动定位

定位流(position属性)的分类 1.相对定位(relative) 2.绝对定位 3.固定定位 4.静态定位 相对定位 什么是相对定位? 就是相对于自己以前在标准流中的位置来移动,相对定位需要配合top/left/right/bottom属性使用 相对定位注意点 1.相对定位是不脱离标准流的,会继续在标准流中占用一份空间 2.在相对定位中,同一个方向上的属性只能使用一个 3.由于相对定位是不脱离标准文档流的,所以在相对定位中是区分块级元素/行内元素/行内块级元素, 即行内元素即使设置为pos

Web全栈-定位流-相对定位

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>定位流</title> <style> *{ margin: 0; padding: 0; } div{ width: 100px; height: 100px; } .box1{ background-color: red; } .box2{

标准文件IO详解(七)---定位流

和文件 IO 中有 lseek 函数类似,C库函数中提供了 fseek .ftell 和 rewind 三个函数来对流进行定位操作.====================================================== 函数原型: 函数参数: stream:要操作的文件流指针 offset:相对于参数 whence 的偏移量 whence:参考点 返回值: 调用成功时返回 0 调用失败时返回 -1 参数whence可以是以下几个值之一: SEEK_SET:代表文件开头 SE

UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流

? 1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. 为了应对这种场景,标准IO库提供了fread和fwrite函数. 函数声明: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fw

关于文件流的简单操作

2015.1.28星期三 小雪变量可以理解为内存gcc -Wall 打开所有警告 指针数组:注意指针数组是以一个NULL指针结束的: c和指针 P105 给定一个指向以NULL结尾的指针列表的指针strings,在列表中的字符串查找一个特定的字符#include <stdio.h>#define TRUE 1#define FALSE 0 int find_char(char **strings,char value){ char *string; while((string = *strin

CSS定位深入理解 完全掌握CSS定位 相对定位和绝对定位

其实前面的标准流和浮动流都很理解,就是定位不太好理解,特别是相对定位和绝对定位,很多刚开始学的同学不好区分.因此这里,小强老师和大家一起分享CSS定位的学习. 通过我们前面的学习,我们网页布局方法: 1. 标准流   (最稳定) 2. 浮动流   (float 其次) 3. 定位流    ( 稳定性最后) 定位是完全脱离标准流的一种布局方式. 其实前面的标准流和浮动流都很理解,就是定位不太好理解,特别是相对定位和绝对定位,很多刚开始学的同学不好区分.因此这里,小强老师和大家一起分享CSS定位的学

css定位流布局

上面我们一起研究了浮动布局的特点和如何清除浮动给布局带来的不良影响,今天我们继续来研究定位流布局的特点和一些常用的布局技巧. 定位流主要有三种,一是相对定位,二是绝对定位,三是固定定位:下面我们一一进行分析. 相对定位 相对定位就是相对于自己以前在标准流中的位置来移动: 写法: position: relative; 示例程序: <style> *{ margin: 0; padding: 0; } div{ width: 100px; height: 100px; } .box1{ back

C++的那些事:流与IO类

1.流的概念 "流"就是"流动",是物质从一处向另一处流动的过程,比如我们能感知到的水流.C++的流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为"流". 为了实现信息的内外流动,C++系统定义了I/O类库,其中的每一个类都称作相应的流或流类,用以完成某一方面的功能.根据一个流类定义的对象也时常被称为流. 通常标准输入或标准输出设备显示器称为标准流