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"); }
函数名称:fileno(在VC++6.0下为_fileno) 函数原型:int _fileno( FILE *stream ); 函数功能:fileno用来取得参数stream指定的文件流所使用的文件描述符 返回值:某个数据流的文件描述符
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步