1. //文件结构体FILE的理解以及缓冲区再讲
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5.  
  6. //要点:文件结构
  7. //struct _iobuf {
  8. // char *_ptr; ------当前缓冲区内容指针
  9. // int _cnt; ------缓冲区还有多少字符
  10. // char *_base; ------缓冲区的起始地址
  11. // int _flag; ------文件流的状态,是否错误或结束
  12. // int _file; -----文件描述符
  13. // int _charbuf; -----双字节缓冲,缓冲2个字节
  14. // int _bufsiz; -----缓冲区大小
  15. // char *_tmpfname; -----临时文件名
  16. //};
  17. //typedef struct _iobuf FILE;
  18.  
  19. void main(){
  20. // stdin是键盘文件指针
  21. char ch;
  22. printf("缓冲区的有效数据是%d\n", stdin->_cnt);
  23. printf("指向缓冲区的指针%x\n", stdin->_ptr);
  24. printf("缓冲区的起始地址%x\n", stdin->_base);
  25. printf("缓冲区的大小%d\n", stdin->_bufsiz);
  26. printf("文件标识符%d\n", stdin->_file);
  27. printf("------------\n");
  28. ch = getchar();
  29. printf("当前获取的字符是%c\n", ch);
  30. printf("缓冲区的有效数据是%d\n", stdin->_cnt);
  31. printf("指向缓冲区的指针%x\n", stdin->_ptr);
  32. printf("缓冲区的起始地址%x\n", stdin->_base);
  33. printf("缓冲区的大小%d\n", stdin->_bufsiz);
  34. printf("文件标识符%d\n", stdin->_file);
  35. //键盘输出123456
  36. //打印结果:
  37. //当前获取的字符是1
  38. //注:getchar()只能获取一个字符,并且将缓冲区内容指针向后移动一个字节(这里ch是char,所以是1个字节,int就会是4个字节)
  39. //缓冲区的有效数据是6
  40. //注:这里对缓冲区的有效数据是6作解释,现在缓冲区内实际字符是7个(1,2,3,4,5,6,回车符)
  41. //因为此时缓冲区内容指针向后移动一个字节,所有有效的就剩下6个
  42. //指向缓冲区的指针f56c701
  43. //注:这里ch是char类型,所以缓冲区内容指针向后移动一个字节
  44. //缓冲区的起始地址f56c700
  45. //缓冲区的大小4096
  46. //文件标识符0
  47. printf("------------\n");
  48. ch = getchar();
  49. printf("当前获取的字符是%c\n", ch);
  50. printf("缓冲区的有效数据是%d\n", stdin->_cnt);
  51. printf("指向缓冲区的指针%x\n", stdin->_ptr);
  52. printf("缓冲区的起始地址%x\n", stdin->_base);
  53. printf("缓冲区的大小%d\n", stdin->_bufsiz);
  54. printf("文件标识符%d\n", stdin->_file);
  55.  
  56. printf("------------\n");
  57. fflush(stdin);
  58. //fflush()函数的作用是有效数据清零,指针回到起始地址
  59. //扩展:
  60. //函数名: fflush
  61. //功 能 : 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时
  62. //头文件:stdio.h
  63. //原型 : int fflush(FILE *stream)
  64. //fflush()函数与stdin->_cnt = 0;stdin->_ptr = stdin->_base;代码等价
  65. /*stdin->_cnt = 0;
  66. stdin->_ptr = stdin->_base;*/
  67.  
  68. //rewind(stdin);
  69. //函数名: rewind()
  70. //功 能 : 将文件内部的位置指针重新指向一个流(数据流 / 文件)的开头
  71. //注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。
  72. //rewind函数作用等同于(void)fseek(stream, 0L, SEEK_SET); [1]
  73. //用 法 : void rewind(FILE *stream);
  74. //头文件: stdio.h
  75.  
  76. //rewind()比fflush()功能更加复杂,rewind()会对文件指针和文件位置指针进行操作,而fflush()主要指针文件位置指针进行操作
  77.  
  78. printf("当前获取的字符是%c\n", ch);
  79. printf("缓冲区的有效数据是%d\n", stdin->_cnt);
  80. printf("指向缓冲区的指针%x\n", stdin->_ptr);
  81. printf("缓冲区的起始地址%x\n", stdin->_base);
  82. printf("缓冲区的大小%d\n", stdin->_bufsiz);
  83. printf("文件标识符%d\n", stdin->_file);
  84. //打印结果:
  85. //当前获取的字符是2
  86. //注:ch是个变量,在内存上有实际地址,清空的只是stdin的缓存,不会影响ch变量
  87. //缓冲区的有效数据是0
  88. //指向缓冲区的指针f56c700
  89. //缓冲区的起始地址f56c700
  90. //缓冲区的大小4096
  91. //文件标识符0
  92.  
  93. system("pause");
  94. }

C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲的更多相关文章

  1. C语言文件操作 FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

  2. c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释_

    1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...

  3. c语言文件操作函数详解

    一.文件操作注意点: 1 打开文件时,如果打开方式加“+”,表示该文件可以“写” ; 2 退出程序一般用exit函数,正常退出参数为0,非正常退出参数为正零值 ; 3 文件的读写操作:按字符.字符串. ...

  4. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  5. 关于C语言文件操作

    关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...

  6. go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  7. C语言文件操作

    C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...

  8. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  9. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

随机推荐

  1. android Android-PullToRefresh 下拉刷新

    1.github下载地址 原作者:  https://github.com/chrisbanes/Android-PullToRefresh 我自己的:  https://github.com/zyj ...

  2. Activity与Fragment的生命周期

    今天看到一张图,详细描述了Activity和Fragment的生命周期,好资源共享咯!

  3. iOS设计模式之组合模式

    组合模式(Composite) 基本理解 整体和部分可以一直对待. 组合模式:将对象组合成树形结构以表示"部分--整体"的层次结构.组合模式使得用户对单个对象和组合独享的使用具有一 ...

  4. Objective-C之@class的使用

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  5. 做一些Spring AOP做过的事,封装 jdk动态代理成为一个黑盒子

      怎么使用eclise 抽取方法,请看  利用eclipse 抽取代码片段为方法   抽取完成之后,还需要 ① 将Collection.class换成  target.getClass(),targ ...

  6. Mysql中的视图

    什么是视图 通俗的讲,视图就是一条SELECT语句执行后返回的结果集.所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 视图的特性 视图是对若干张基本表的引用,一张虚表,查询语句执 ...

  7. maven 的 pom.xml 文件报错:ArtifactTransferException: Failure to transfer

    因为maven下载依赖jar包时,特别慢,所以取消了下载过程,再次打开eclipse时,maven的pom.xml文件报错如下: ArtifactTransferException: Failure ...

  8. 数据库update的异常一例

    调查一列bug,偶然发现了update的一个特性:update t set a=a+1 where id=4; 这样一条简单的语句,也会发生让人意外的事情: 如果 a 的初始值为null时,无论你up ...

  9. javascript中数组的map方法

    map方法原型:array1.map(callbackfn[, thisArg]) 参数: array1,必选. 一个数组对象.该函数一般用于数组对象 callbackfn,必选. 最多可以接受三个参 ...

  10. cocos2d-x之初试内存管理机制

    bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getIn ...