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