C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲
- //文件结构体FILE的理解以及缓冲区再讲
- #include<stdio.h>
- #include<stdlib.h>
- //要点:文件结构
- //struct _iobuf {
- // char *_ptr; ------当前缓冲区内容指针
- // int _cnt; ------缓冲区还有多少字符
- // char *_base; ------缓冲区的起始地址
- // int _flag; ------文件流的状态,是否错误或结束
- // int _file; -----文件描述符
- // int _charbuf; -----双字节缓冲,缓冲2个字节
- // int _bufsiz; -----缓冲区大小
- // char *_tmpfname; -----临时文件名
- //};
- //typedef struct _iobuf FILE;
- void main(){
- // stdin是键盘文件指针
- char ch;
- printf("缓冲区的有效数据是%d\n", stdin->_cnt);
- printf("指向缓冲区的指针%x\n", stdin->_ptr);
- printf("缓冲区的起始地址%x\n", stdin->_base);
- printf("缓冲区的大小%d\n", stdin->_bufsiz);
- printf("文件标识符%d\n", stdin->_file);
- printf("------------\n");
- ch = getchar();
- printf("当前获取的字符是%c\n", ch);
- printf("缓冲区的有效数据是%d\n", stdin->_cnt);
- printf("指向缓冲区的指针%x\n", stdin->_ptr);
- printf("缓冲区的起始地址%x\n", stdin->_base);
- printf("缓冲区的大小%d\n", stdin->_bufsiz);
- printf("文件标识符%d\n", stdin->_file);
- //键盘输出123456
- //打印结果:
- //当前获取的字符是1
- //注:getchar()只能获取一个字符,并且将缓冲区内容指针向后移动一个字节(这里ch是char,所以是1个字节,int就会是4个字节)
- //缓冲区的有效数据是6
- //注:这里对缓冲区的有效数据是6作解释,现在缓冲区内实际字符是7个(1,2,3,4,5,6,回车符)
- //因为此时缓冲区内容指针向后移动一个字节,所有有效的就剩下6个
- //指向缓冲区的指针f56c701
- //注:这里ch是char类型,所以缓冲区内容指针向后移动一个字节
- //缓冲区的起始地址f56c700
- //缓冲区的大小4096
- //文件标识符0
- printf("------------\n");
- ch = getchar();
- printf("当前获取的字符是%c\n", ch);
- printf("缓冲区的有效数据是%d\n", stdin->_cnt);
- printf("指向缓冲区的指针%x\n", stdin->_ptr);
- printf("缓冲区的起始地址%x\n", stdin->_base);
- printf("缓冲区的大小%d\n", stdin->_bufsiz);
- printf("文件标识符%d\n", stdin->_file);
- printf("------------\n");
- fflush(stdin);
- //fflush()函数的作用是有效数据清零,指针回到起始地址
- //扩展:
- //函数名: fflush
- //功 能 : 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时
- //头文件:stdio.h
- //原型 : int fflush(FILE *stream)
- //fflush()函数与stdin->_cnt = 0;stdin->_ptr = stdin->_base;代码等价
- /*stdin->_cnt = 0;
- stdin->_ptr = stdin->_base;*/
- //rewind(stdin);
- //函数名: rewind()
- //功 能 : 将文件内部的位置指针重新指向一个流(数据流 / 文件)的开头
- //注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。
- //rewind函数作用等同于(void)fseek(stream, 0L, SEEK_SET); [1]
- //用 法 : void rewind(FILE *stream);
- //头文件: stdio.h
- //rewind()比fflush()功能更加复杂,rewind()会对文件指针和文件位置指针进行操作,而fflush()主要指针文件位置指针进行操作
- printf("当前获取的字符是%c\n", ch);
- printf("缓冲区的有效数据是%d\n", stdin->_cnt);
- printf("指向缓冲区的指针%x\n", stdin->_ptr);
- printf("缓冲区的起始地址%x\n", stdin->_base);
- printf("缓冲区的大小%d\n", stdin->_bufsiz);
- printf("文件标识符%d\n", stdin->_file);
- //打印结果:
- //当前获取的字符是2
- //注:ch是个变量,在内存上有实际地址,清空的只是stdin的缓存,不会影响ch变量
- //缓冲区的有效数据是0
- //指向缓冲区的指针f56c700
- //缓冲区的起始地址f56c700
- //缓冲区的大小4096
- //文件标识符0
- system("pause");
- }
C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲的更多相关文章
- C语言文件操作 FILE结构体
内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...
- c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释_
1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...
- c语言文件操作函数详解
一.文件操作注意点: 1 打开文件时,如果打开方式加“+”,表示该文件可以“写” ; 2 退出程序一般用exit函数,正常退出参数为0,非正常退出参数为正零值 ; 3 文件的读写操作:按字符.字符串. ...
- 【转】C语言文件操作解析(三)
原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...
- 关于C语言文件操作
关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- C语言文件操作
C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
随机推荐
- 【转】Visual Studio项目相对路径的设置,实用
这篇文章主要写给那些以前没有用过VS的新手,同时也是自己学习经验的积累,高手就不用看了以免浪费您宝贵的时间. 在VS的工程中常常要设置头文件的包含路径,当然你可以使用绝对路径,但是如果你这样设置了你只 ...
- IOS中的多核并发编程GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...
- 强制IE使用最高版本引擎渲染页面,避免默认使用IE7引擎导致的页面布局混乱及其它问题
背景 基于Asp.net MVC的一个Intranet web application, 现象 Application发布到服务器端后,在客户端IE访问页面布局混乱,并有javascript报错 原因 ...
- python yield
http://www.jb51.net/article/15717.htm 这里还不错 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist(alist) ...
- postfix删除队列中的邮件
Postfix中有一套Mail Queue Management机制,所有队列中的邮件都可以全自动的处理,但在发送大量邮件的时候,有必要对这个队列进行手工的维护处理,比如说,删除队列中的邮件. 以下是 ...
- Oracle instr函数与SqlServer charindex的区别
INSTR(C1,C2[,I[,J]]) [功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数] C1 被搜索的字符串 ...
- 用java程序输出自己的姓名
代码部分: public class Hello { public static void main(String[] args) { System.out.println("$$$$$$$ ...
- C# 日志框架的添加
.NET中 记录日志的比较好的主要是Log4Net和Enterprise Library的Logging 复杂一点的还可以实现自动化Log日志 教程 首先是第二种方式 1.需要添加以下几个DLL 下 ...
- mysql插入数据与删除重复记录的几个例子(收藏)
mysql插入数据与删除重复记录的几个例子 12-26shell脚本实现mysql数据的批量插入 12-26mysql循环语句插入数据的例子 12-26mysql批量插入数据(insert into ...
- cut
cut是一个针对行的数据选取命令 SYNOPSIS cut [OPTION]... [FILE]... OPTION -b 以字节为单位进行分割,如果是多字节的话就需要注意了 -c 以字符为单位进行分 ...