流与缓冲

1 目的:

  为了使程序的运行效率最高,流对象通常提供缓冲区来减少调用系统I/O库函数的次数。

2 三大缓冲:

  全缓冲:缓冲区满才调用系统I/O函数。对于读操作,知道读取的字节数等于了缓冲区大小或者说到了文件的末尾,才进行实际的I/O操作。

  行缓冲:直到遇到了' '才调用I/O库函数。注意,因为缓冲区大小是有限制的,所以一旦缓冲满了也没有遇到 ,仍然会进行实际的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
");
 7     else if(stdin->_flags & _IO_LINE_BUF)
 8         printf("line-buffered
");
 9     else
10         printf("fully-buffered
");
11     printf("buffer size is %d
", stdin->_IO_buf_end - stdin->_IO_buf_base); /* 输出缓冲区的大小 */
12     printf("discriptor is %d

", fileno(stdin)); /* 输出文件描述符 */
13     printf("stdout is ");
14     if(stdout->_flags & _IO_UNBUFFERED) /* 判断标准输出流对象的缓冲区类型*/
15         printf("unbuffered
");
16     else if(stdout->_flags & _IO_LINE_BUF)
17         printf("line-buffered
");
18     else
19         printf("fully-buffered
");
20     printf("buffer size is %d
", stdout->_IO_buf_end - stdout->_IO_buf_base); /* 输出缓冲区的大小 */
21     printf("discriptor is %d

", fileno(stdout)); /* 输出文件描述符 */
22     printf("stderr is ");
23     if(stderr->_flags & _IO_UNBUFFERED) /* 判断标准出错流对象的缓冲区类型*/
24         printf("unbuffered
");
25     else if(stderr->_flags & _IO_LINE_BUF)
26         printf("line-buffered
");
27     else
28         printf("fully-buffered
");
29     printf("buffer size is %d
", stderr->_IO_buf_end - stderr->_IO_buf_base); /* 输出缓冲区的大小 */
30     printf("discriptor is %d

", fileno(stderr)); /* 输出文件描述符 */
31     return 0;
32 }

5 截图

原文地址:https://www.cnblogs.com/lanjianhappy/p/7193159.html