//文件结构体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");
}