首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当printf可以自己打印时,为什么还要在printf之后使用fflush呢?

在C语言中,printf函数用于将数据输出到标准输出流(stdout),但是输出到标准输出流并不意味着立即将数据显示在屏幕上。相反,printf函数通常会将数据存储在缓冲区中,然后在适当的时机将缓冲区的内容刷新到屏幕上。

而fflush函数的作用就是强制将缓冲区的内容立即刷新到输出设备上,以确保数据能够及时显示在屏幕上。所以,即使printf函数可以自己打印,但在某些情况下,我们仍然需要使用fflush函数来确保数据的及时显示。

以下是一些使用fflush函数的常见情况:

  1. 在需要立即将数据显示在屏幕上的情况下,可以在printf之后使用fflush。例如,在需要实时显示进度条或日志信息的程序中,可以在每次输出后使用fflush来确保信息立即显示。
  2. 在输出重定向或管道操作中,使用fflush可以确保数据及时传递给下一个程序或文件。在这种情况下,缓冲区的内容不会自动刷新,需要使用fflush手动刷新。
  3. 在程序中需要进行输入和输出的切换时,使用fflush可以清空缓冲区,避免输入和输出混乱。例如,在使用scanf读取用户输入后,如果需要立即输出一些信息,可以在scanf之后使用fflush清空缓冲区。

需要注意的是,fflush函数只对输出流有效,对输入流是没有作用的。另外,使用fflush函数会带来一定的性能开销,因此在不必要的情况下应尽量避免频繁使用。

腾讯云相关产品和产品介绍链接地址: 腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储等。具体可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux的vim下制作进度条

则输入:q 要上下翻:用键盘的上下键(千万不要用鼠标哦,自己可以试试看哦,在Linux下,鼠标大多是没用的)) man fflush //man 命令:可以查看该命令的具体信息 将会出现如下信息...*为什么'\r'就不显示任何东西(没有fflush的情况下) *这里要讲到缓冲区的概念 *因为在计算机内部,如果每次输出直接输出到屏幕,是非常慢的,因为它是外部设备,输出需要用到...语句输出的内容通常并不是该语句执行完了就立马打印,而是先放在缓冲区再打印,但是为什么平时看起来是立马打印?...因为我们通常会在printf的语句的最后加上一个'\n',遇到'\n',计算机会自动刷新缓冲区的内容到输出设备,而我们的printf就是输出到显示器,这就是为啥printf完就立马输出的原因(⊙o⊙...Σ(っ °Д °;)っ哇哦,所以打印,显示器上会显示光标前的内容,并清空缓冲区,但是光标已经在缓冲区的开头,所以没有输出任何东西ฅʕ•̫͡•ʔฅ 而fflush的作用是(⊙o⊙)????

9210

【Linux】实现进度条小程序

在老式打字机上面就会有下面这样的拨片,打完一行之后,得手动把它往回拨,一拨纸就往上走(换行),写入位置就往左走,对应就是回车。 3....不加"\n"这个字符串打印就没有显示出来,先sleep,再到程序退出的时候才显示这个字符串。 那么在不加"\n"那么printf和sleep哪个先运行?...不带"\n"的时候,字符串就在缓冲区里,return 0,程序结束,一般要自动冲刷缓冲区。 想要在程序结束之前就刷新缓冲区,有3种方式: 1. "\n"直接就把缓冲区数据就刷出来了。...ffush把特定文件流进行刷新: 在Linux下一切皆文件,可以把显示器文件看。...为什么要这么写? 在之后如果用户写一个图形化界面的进度条,就能在下载的时候同时更新图形化界面。 也可以让进度条加上颜色,只需要在网上找一个关于用C语言输出有颜色相关的内容也就会有了。

13610
  • Linux上写一个进度条小程序

    代码 3 好像什么都没打印,这是为什么? 在解答这些问题之后,我们先了解一下行缓冲。 2、认识行缓冲 在内存中预留了一块空间,用来缓冲输入或输出的数据,这个保留的空间被称为缓冲区。...之前说过 \r 是换行,所以 printf 遇到 \r ,就把光标移到开头。sleep 睡眠后,程序退出,shell 打印提示符,就覆盖了字符串。 拓展 : 数据真的是临时保留在缓冲区里的吗?...光标指向字符串开头;打印 shell 提示符,就直接从光标位置开始覆盖。...在每次刷新之后使用 sleep 函数,间隔一定的时间。...进度条是一行中的,所以需要用到 '\r' ,每次都需要使用 fllush 主动刷新缓冲区。 每次刷新出数据之后,将 = 填充到数组中,并且显示 > 。在最后一次显示,控制 > 不要显示。

    1.6K10

    进度条小程序

    现象:先休眠三秒,在最后结束的狮虎打印出内容 这这种场景中,sleep函数和printf函数,哪一个先运行的??...答案是printf先运行,在休眠的这三秒间里,printf已经执行完了,字符串被保存在缓冲区 缓冲区的概念需要在操作系统层面上理解,单纯在语言基础上是很难理解的 缓冲区是一个内存空间,休眠的时候,字符串在缓冲区里...,程序结束return 0,,强制冲刷缓冲区,再打印出字符串。...因此在printf函数里不能使用\n,使用换行会让新数字在老数字下面。...正确做法是在printf函数后面使用\r回车符号,每打印一个数字,让光标回到这一行最开始的位置,这样打印出来的新数字就会覆盖旧数字。

    11310

    基础IO

    shell执行的命令通常有两种 第三方提供的对应的在磁盘中有具体二进制文件的可执行程序(由字进程程序执行 shell内部,自己实现的方法,由自己(父进程)来执行 什么叫做文件 站在系统的角度,只要是能够被读取或者能够被写出的设备都可以叫做文件...("%d\n",fd); fflush(stdout); close(fd); return 0; } 我们发现1就没有在显示器上打印出来,而是写到了test.txt中 为什么会这样...系统的接口直接进入内核的缓存区中,此时父进程就没有数据了,那么子进程也就不能没有数据进行拷贝,那么最后的结果就只有一份数据 为什么显示到显示器上的时候就是一次?...语言的缓存区,是语言自己封装的。 为什么要用缓冲区?...为什么会这样? 是因为在关闭标准输出之后close(1),数据还没有进入标准输出的文件之中。那么最后程序执行完毕之后,也就不会显示什么内容。

    19210

    【Linux】开始了解重定向

    为什么不加入fflush 结果是log.txt文件里也什么都没有??? 就是因为内容写入到文件内核缓冲区里还没有刷新就被close关闭了,所以还没刷新就文件被关闭了,怎么打印到文件中。...而且我们不写fflush 不写close 就可以成功打印到文件中!!!...所以我们操作系统与语言层中,我们的printf 和 fprintf就不需要考虑我们如何将内容写入到文件中,这不是他们需要关心的事情!!! 那为什么会拷贝两次???...现象 2 : 按理说我们fork()之后,创建了子进程,子进程会继承父进程的代码与数据。那么为什么显示器只打印了一遍???...而向文件打印,fork之前语言缓冲区有内容(printf fprintf ),内核缓冲区有内容(write)。

    8710

    【Linux】自动化构建工具makeMakefile和git介绍

    举例 依赖文件列表以空格进行分割,依赖文件列表可以为空,如上方的clean。上方直接使用make,为什么会执行第一对依赖关系?因为如果make后面什么都不跟,就会默认执行第一对依赖关系。...vim里面也可以定义变量的。直接用=号,两边不要空格 。这里的定义变量就相当于c语言里的宏一样,可以进行替换。 @符号的作用:在外面执行指令,不会打印出依赖方法 。...冲刷缓冲区有三种方法: \n 缓冲区满了 强制刷新:fflush stdout就是显示器的意思。缓冲区是以行刷新的,如果不想换行,就可以fflush刷新。...上面是打印倒计时的程序,不过在运行时,为什么不会进行打印?因为\r会让光标回到行首,光标指的地方,内容就被覆盖了,下图是在VS中测试的结果,此时光标在3的位置,3就被覆盖了,无法打印出来。...我们只需要fflush强制冲刷缓冲区就可以解决了。 如果我们把倒计时从10开始,会发现打印后面会多一个0。因为我们打印打印的是字符,光标没有移动到后面,就不会把10后面的0覆盖掉。

    11910

    【Linux修炼】13.缓冲区

    log.txt中,C接口的打印了两次,这是什么原因?...这就涉及到缓冲区刷新策略的问题: 缓冲区刷新策略的问题 上述我们提到,张三的包裹送到了顺丰,但是张三再次来到顺丰邮寄另一个包裹,发现之前的包裹还在那里放着,毫无疑问,张三会去找工作人员理论:为什么这么长时间还没有发...解释打印两次的现象 有了缓冲区的理解,现在就足以解释打印两次的现象: 由于代码结束之前,进行创建子进程: 如果我们不进行重定向,看到四条消息 stdout默认使用的是行刷新,在进程进行fork之前,...无论谁先退出,都一定会进行缓冲区的刷新(就是修改缓冲区)一旦修改,由于进程具有独立性,因此会发生写拷贝,因此数据最终会打印两份。 write函数为什么没有?...如果OS宕机了,那么数据就有可能出现丢失,因此如果我们想及时的将数据刷新到外设,就需要一些其他的接口强制让OS刷新到外设,即一个新的接口:int fsync(int fd),调用这个函数之后可以立即将内核缓冲区的数据刷新到外设中

    1.8K00

    不可不知的三种缓冲类型

    为什么有时候写入文件的内容却没有?没什么printf打印在终端的内容看不到?这一切背后有着怎样早为人知的秘密? 今天来说说缓冲的事。也许你已经听说过三种缓冲模式,但是今天要讲的不止这些。...缓冲 为了减少使用read和write调用的次数,标准IO库提供了缓冲,有人可能会问,为什么要减少它们的调用次数?...除了等待程序运行完成,还可以使用fflush函数,它可以将缓冲区中的内容写入到磁盘中(终端驱动设备表示丢弃缓冲区的数据)。...所以将fwrite下面一行的注释去掉后,就可以发现,写入之后,就可以直接在文件中看到内容了。 所以当你在写一个文件,但是查看文件却没有任何写入内容,不要一直怀疑自己的代码。...聪明的你当然也知道,要想打印完后直接输出到终端,只需要改成下面这样就可以了: printf("wechat:shouwangxiansheng\n"); 不带缓冲 这个从字面就可以理解其意思了。

    55110

    【Linux】理解缓冲区

    一.引入 我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么?肯定和fork有关!...对于这个现象的问题我们可以直接往下看 ---- 二.认识缓冲区 1.为什么 缓冲区的本质就是一段内存。...,比如调用printf直接fflush 2.行刷新——行缓冲——显示器 ,数据的printf带上\n就会立马显示到显示器上。...3.在哪里 缓冲区的位置究竟在哪里:从上面的例子我们直接往显示器上打印结果为4条,往文件打印为7条,这跟缓冲区有关,同时这也说明了缓冲区一定不在内核中,为什么?...同时发生了写拷贝,父子进程各自刷新 ---- 三、理解缓冲区 对于缓冲区的理解我们可以自己通过代码来简单实现: FILE_结构体的设计,这里为了避免与FILE发生冲突,我们命名为FILE_: #define

    22140

    【Linux系统编程】Linux第一个小程序——进度条

    所以肯定是先执行printf,再执行sleep,毋庸置疑。 2.2 原因解释 那为什么我们看到的是先休眠,后打印,两个程序打印的时机为什么不一样?...那为什么两个程序打印的时间不一样? 原因其实是因为两个程序的缓冲区刷新的时机不同。...大家看这样写是不是就行了 这里从9开始倒计时,i从9到0,循环打印,\r保证每个数字打印之后都把光标移到起始位置,fflush刷新缓冲区,这样使得每个数字可以分开显示,每次循环i都可以刷新出来,然后休眠...计算机内部使用二进制表示整数,但在显示器上呈现给用户,需要将其转换为对应的字符形式。 那怎么解决?也很简单: 我们指定域宽就行了。...然后我们循环打印并不断添加#就行了,当然我们这里还应该使用\r不断的回车,使每一次新打印的覆盖之前的,并且每次循环printf之后使用fflush刷新缓冲区,这样才能每次循环都够打印出来内容,要不然程序结束之前一直留存在缓冲区

    27310

    C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);

    那么为什么需要清空键盘缓冲区?...可是执行程序后会发现出了问题:从键盘输入一个字符后,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符’a’, 打印结果是97,10。这是为什么?...使用 fflush(stdin); 或 rewind(stdin); 均可起到清空键盘缓冲区的作用,这两个函数均包含在stdio.h这个头文件中 修正后的写法: Sample two 01 05...("ch1 = %d", ch1); 15 16 fflush(stdin); 17 18 scanf("%c", &ch2); 19 printf("ch2 = %d", ch2); 20 return...:Hi i…like you Hi i…like you 此外,关于使用 gets() 函数需要注意:使用 gets() ,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符

    2.8K31

    【Linux】理解系统中一个被打开的文件

    所以我们得出第一个结论,进程默认已经打开了0、1、2,我们可以直接使用0、1、2进行数据的访问! 接下来我们验证另一个问题,当我们关闭0号 fd ,再打开一个文件,会给该文件分配哪一个 fd ?...答案是不会的,因为在内核当中存在引用计数,该引用计数记录的是有多少个文件指针指向自己有一个文件指针把它关闭之后,引用计数会减一,并不会直接关闭文件,引用计数为 0 ,说明已经没有文件指针指向自己...如下所示: 如图,为什么 hello, stderr 还会打印出来?...如果我们需要将 stdout、stderr 打印到一个文件里,应该怎么做?此时我们需要在后面加上 2>&1,即如下: 这又是什么意思?...但是我们发现,发生写拷贝的都是C语言的接口,系统接口write并没有发生写拷贝,即没有使用C语言的缓冲区,这是为什么

    15110

    Linux的Makefile进度条

    使用之后make也能够直接替换变量内容。 那为什么我们需要定义变量?就像是在C语言中的宏一样,以后的这个基本就不会改变了,就只是会在定义的时候发生变化,这样能够简化操作。...这又是为什么? 那是因为在make的时候虽然默认是从上到下扫描,但是扫描完第一行之后发现没有code.o文件,由于code.o没存在,所以make先继续向下找,直到找到最后一行的时候才开始返回。...满足条件,一步一步再向上返回。 makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。...答案的话是先执行printf。 1、在sleep期间,printf又在哪?在缓冲区内—一段内存空间。 2、但是为什么有的时候printf并不是在sleep之前打印?...4、实现倒计时 根据上面的知识,能不能弄一个倒计时? 首先倒计时的话,不能像是之前那样子一样,直接就是printf打印从9到0,因为这样子的话不算是倒计时,如果不相信可以自己打印试试。

    4510

    【Linux】进度条小程序の深度解剖(7)

    /processbar 执行程序 细节:为什么在makefile中不用包含头文件?...“\n”和“\r”在缓冲区中的作用效果差别 众所周知,在Linux中,显示器可以被当作一个文件; 而且显示器默认是行刷新,也就是输出内容配上“\n”后会直接回车+换行并立刻将内容打印在屏幕上,待睡眠结束后...,才会弹出操作框; 而输出内容配上“\r”后,其会先输出到缓冲区中,待睡眠结束后才会和操作框一起输出; #include int main() { printf("hello Makefile...\r");待睡眠结束后才会和操作框一起打印 } 二.fflush函数 fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。...1.设计进度条主体部分 1.打印为进度条预留空间 设计一个字符数组,并初始化;此时其为一个空串; memset(bar, 0 ,sizeof(bar)); 2.调整进度条主体加载方向 在Linux环境下

    11110

    Linux-基础IO

    ✈️当前路径   当我们在程序中创建一个文件,例如使用 fopen函数以 ‘w’ 方式打开文件,文件不存在则创建文件,但是为什么文件创建位置是在当前路径下?   ...我们使用Linux都知道,想要对一个文件进行操作,我们必须要打开一个文件,这是必须的。但是为什么 显示器文件、键盘文件 这些文件我们并不需要直接打开就可以直接使用?...当我们使用C语言运行一个程序的时候,操作系统会默认将这三个流给打开,于是,我们使用printf、scanf、gets、puts等接口可以直接使用。   ...,但是当我们第二次运行并且重定向到空文件当中却出了问题,你可以先思考为什么。   ...这是因为write函数是系统调用,并 不参与 语言层的缓冲区,所以只打印一次。   某一个进程退出,那么一定要将自己缓冲区中的数据刷新到内核当中,而 刷新的本质就是写入!

    9310

    Linux中的软件安装进度条怎么搞?

    事实上,上面的代码中由于printf在sleep之前,所以printf永远先于sleep执行,但是先执行printf不代表先打印。...printf执行后,要打印的内容放入缓冲区,但不一定会被立即刷新到屏幕上。 这里要提一下缓冲区的3种缓冲策略: 无缓冲:数据不缓冲,直接打印到外设中(屏幕、磁盘等等)。...再结合上面两段代码及现象,可以得出上面打印采用的是行缓冲(遇到\n就把要打印的内容打印在屏幕上)。...三、倒计时的程序 如果每次打印完都回车,就相当于在第一个位置打印一个数字后,又回到该位置,继续打印下一个数字。这样就可以实现倒计时的效果。...这里可以fflush函数强行让屏幕刷新,就可以实现想要的效果了。 使用fflush刷新stdout(即屏幕的文件流),使每次进入缓冲区的内容被立即打印出来。

    1.2K30
    领券