如何理解c语言文件,C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲

本文详细介绍了C语言中文件结构体`FILE`的内部组成,包括缓冲区指针、缓冲区大小等成员的含义,并通过示例展示了`getchar()`函数如何影响缓冲区。同时,探讨了`fflush()`和`rewind()`函数在清除缓冲区和重置文件位置指针上的作用,帮助读者深入理解文件输入输出的管理机制。
摘要由CSDN通过智能技术生成

//文件结构体FILE的理解以及缓冲区再讲

#include#include

//要点:文件结构//struct _iobuf {//char *_ptr; ------当前缓冲区内容指针//int _cnt; ------缓冲区还有多少字符//char *_base; ------缓冲区的起始地址//int _flag; ------文件流的状态,是否错误或结束//int _file; -----文件描述符//int _charbuf; -----双字节缓冲,缓冲2个字节//int _bufsiz; -----缓冲区大小//char *_tmpfname; -----临时文件名//};//typedef struct _iobuf FILE;

voidmain(){//stdin是键盘文件指针

charch;

printf("缓冲区的有效数据是%d", stdin->_cnt);

printf("指向缓冲区的指针%x", stdin->_ptr);

printf("缓冲区的起始地址%x", stdin->_base);

printf("缓冲区的大小%d", stdin->_bufsiz);

printf("文件标识符%d", stdin->_file);

printf("------------");

ch=getchar();

printf("当前获取的字符是%c", ch);

printf("缓冲区的有效数据是%d", stdin->_cnt);

printf("指向缓冲区的指针%x", stdin->_ptr);

printf("缓冲区的起始地址%x", stdin->_base);

printf("缓冲区的大小%d", stdin->_bufsiz);

printf("文件标识符%d", 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("------------");

ch=getchar();

printf("当前获取的字符是%c", ch);

printf("缓冲区的有效数据是%d", stdin->_cnt);

printf("指向缓冲区的指针%x", stdin->_ptr);

printf("缓冲区的起始地址%x", stdin->_base);

printf("缓冲区的大小%d", stdin->_bufsiz);

printf("文件标识符%d", stdin->_file);

printf("------------");

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", ch);

printf("缓冲区的有效数据是%d", stdin->_cnt);

printf("指向缓冲区的指针%x", stdin->_ptr);

printf("缓冲区的起始地址%x", stdin->_base);

printf("缓冲区的大小%d", stdin->_bufsiz);

printf("文件标识符%d", stdin->_file);//打印结果://当前获取的字符是2//注:ch是个变量,在内存上有实际地址,清空的只是stdin的缓存,不会影响ch变量//缓冲区的有效数据是0//指向缓冲区的指针f56c700//缓冲区的起始地址f56c700//缓冲区的大小4096//文件标识符0

system("pause");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值