首页 > 代码库 > 流与缓冲
流与缓冲
1 目的:
为了使程序的运行效率最高,流对象通常提供缓冲区来减少调用系统I/O库函数的次数。
2 三大缓冲:
全缓冲:缓冲区满才调用系统I/O函数。对于读操作,知道读取的字节数等于了缓冲区大小或者说到了文件的末尾,才进行实际的I/O操作。
行缓冲:直到遇到了‘\n‘才调用I/O库函数。注意,因为缓冲区大小是有限制的,所以一旦缓冲满了也没有遇到\n,仍然会进行实际的I/O操作。标准输入stdin和stdout默认为行缓冲
无缓冲:数据立即读入或者输出到外存文件或者设备。stderr是无缓冲的,这样可以实时的保证错误的提示并反馈给客户。
3 三个缓冲分别定义了三个宏:使用方法:缓冲标志和宏做与操作 如果结果为1那么就可直到该缓冲文件流的缓冲区是否是属于该类型了。
4 例子:得到文件流的缓冲区类型。输出标准输出 标准输入和标准出错三个文件描述符的缓冲区类型 大小等信息
1 #include <stdio.h> 2 int main(void) 3 { 4 printf("stdin is "); 5 if(stdin->_flags & _IO_UNBUFFERED) /* 判断标准输入流对象的缓冲区类型*/ 6 printf("unbuffered\n"); 7 else if(stdin->_flags & _IO_LINE_BUF) 8 printf("line-buffered\n"); 9 else 10 printf("fully-buffered\n"); 11 printf("buffer size is %d\n", stdin->_IO_buf_end - stdin->_IO_buf_base); /* 输出缓冲区的大小 */ 12 printf("discriptor is %d\n\n", fileno(stdin)); /* 输出文件描述符 */ 13 printf("stdout is "); 14 if(stdout->_flags & _IO_UNBUFFERED) /* 判断标准输出流对象的缓冲区类型*/ 15 printf("unbuffered\n"); 16 else if(stdout->_flags & _IO_LINE_BUF) 17 printf("line-buffered\n"); 18 else 19 printf("fully-buffered\n"); 20 printf("buffer size is %d\n", stdout->_IO_buf_end - stdout->_IO_buf_base); /* 输出缓冲区的大小 */ 21 printf("discriptor is %d\n\n", fileno(stdout)); /* 输出文件描述符 */ 22 printf("stderr is "); 23 if(stderr->_flags & _IO_UNBUFFERED) /* 判断标准出错流对象的缓冲区类型*/ 24 printf("unbuffered\n"); 25 else if(stderr->_flags & _IO_LINE_BUF) 26 printf("line-buffered\n"); 27 else 28 printf("fully-buffered\n"); 29 printf("buffer size is %d\n", stderr->_IO_buf_end - stderr->_IO_buf_base); /* 输出缓冲区的大小 */ 30 printf("discriptor is %d\n\n", fileno(stderr)); /* 输出文件描述符 */ 31 return 0; 32 }
5 截图
流与缓冲
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。