首页 > 代码库 > 流与缓冲

流与缓冲

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 截图

技术分享

 

流与缓冲