✀尀n‘如果成功被printf成功输出了,那么输出缓冲区就会被清除,对吗?

2025-02-27 11:29:19
推荐回答(5个)
回答1:

理解这个问题首先要知道三种缓冲模式。

行缓冲
全缓冲
不缓冲
对于一个shell中运行的程序,默认的标准输出是控制台,而控制台是行缓冲的,也就是系统在缓冲区看到换行符,就帮你冲洗缓冲区。
如果你把标准输出重定向到一个文件,则标准输出就是全缓冲了,这样的机制,系统会安缓冲区满的时候或者程序结束的时候冲洗缓冲区。
于是lz的问题应该这样理解,aa和cc放到缓冲区以后都没有输出
一直等到符合该缓冲区的条件以后,触发输出
如果手动调用fflush,也可以触发输出,这就是强制冲洗,不是利用系统机制了

回答2:

问的很好,呵呵


缓冲区就是一个打开了的文件。我们可以把缓冲区关了。自己做一个缓冲区、

#include "stdio.h"
#include "stdlib.h"
int main()
{
fclose(stdout);//关闭输出缓冲区
// 自己设计一个缓冲区
FILE fp = __iob_func()[1] = *fopen("我自己输出缓冲区.txt","w");
printf("%d,%d\n",1,2);
puts("pause");
printf("%d,%d\n",3,4);
puts("pause");
getchar();
return 0;
}


只有程序关闭或者fflush的时候,才会把数据弄到里面。

你不写代码刷新,系统是不会帮你刷新的,哪怕你写的换行符。


回到你的问题上来,

aa,cc按照格式 会形成一个串“1,1”  ,然后往所谓的缓冲区里写,写了之后就不管了。你即使在控制台按回车也没有用。


这个就好比写一个字符串到文件。。。算是被这个问题搞深刻了

回答3:

依赖于具体实现。C标准上只要求:初始打开的时候,当且仅当可以确定标准输出流stdout连接的是非交互设备的时候,对其作全缓冲,即直到缓冲区满了再把缓冲的内容从缓冲区取走传给主系统。而当标准输出流stdout连接的是交互设备(比如控制台)的时候,是否作缓冲交给具体实现决定。对此,多数实现都选择的对标准输出流stdout作行缓冲,即当见到换行符'\n'的时候便把缓冲的内容从缓冲区取走传给主系统。就你的例子而言,aa和cc的值会依次进入标准输出流,但cc不会等到aa的值离开标准输出流之后再进入。也就是说,它们会一次性进入,也会一次性离开,因为两个%d之间没有换行符。

回答4:

C++ 程序的 cout << endl; 这个 endl 有 fflush(stdout); 的功能,能做到换行 和 清空输出缓冲区。
printf("\n"); 是否 有 类似 cout << endl 的功能,书本上也没提起过。
printf("%d\n,%d",aa,cc); 能清空 aa 再放入cc吗? 书本上没提起过。

最保险的 是 用 fflush(stdout);
例如:
printf("%d\n,%d",aa,cc); fflush(stdout);
-----------------------------------------------
为提高程序运行速度,通常 printf("%。。。, 特别是在循环语句里,并不立即 输出到 屏幕,
和清空输出缓冲区。
------------------
fflush(stdout); -- 立即输出并清空输出缓冲区。

回答5:

输出缓冲区不会存留任何数据吧?一旦里边有数据,操作系统有一种机制就会把这个数据打印到屏幕上去,直到缓冲区里什么都没有了为止。其实屏幕上的东西并不是printf函数打印上去的,
printf函数的任务就是按照程序员写入的格式把数据存放到输出缓冲区里去,就算完成输出任务了……