linux下printf函数为什么不加\n就不能输出相关的内容 ?

转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/53255970

原因:  输出缓冲区的问题.

unix上标准输入输出都是带有缓存的,一般是行缓存。

对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。

ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数没有带'\n'是不会自动刷新输出流,直至缓存被填满。


解决方案:

方案1、在printf里加"\n"

方案2、fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上 。


  fflush(stdout); //  刷新一下缓冲区 让它马上输出.  在printf 之后调用它,就会马上输出了.  
  setvbuf(stdout,NULL,_IONBF,0); //如果你嫌上个方法麻烦, 就使用这个函数. 直接将缓冲区禁止了. 它就直接输出了。

这两个函数都是有关流缓冲区的. 具体使用和说明网上有很多.   我只说一下什么是流缓冲区, 是做什么用的。

  操作系统为减少 IO操作 所以设置了缓冲区.  等缓冲区满了再去操作IO. 这样是为了提高效率。


下面是测试代码:

方案1:

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. void main()
  4. {
  5. int i;
  6. for(i= 0;i< 10;i++)
  7. {
  8. printf( "\r %d%% is complete.\n",i);
  9. sleep( 1);
  10. }
  11. printf( "\n");
  12. }


方案2:

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. void main()
  4. {
  5. int i;
  6. for(i= 0;i< 10;i++)
  7. {
  8. printf( "\r %d%% is complete.",i);
  9. fflush( stdout);
  10. sleep( 1);
  11. }
  12. printf( "\n");
  13. }


  1. #include<stdio.h>
  2. #include<unistd.h>
  3. void main()
  4. {
  5. int i;
  6. setvbuf(stdout,NULL,_IONBF,0); //直接将缓冲区禁止了. 它就直接输出了
  7. for(i= 0;i< 10;i++)
  8. {
  9. printf( "\r %d%% is complete.",i);
  10. sleep( 1);
  11. }
  12. printf( "\n");
  13. }

猜你喜欢

转载自blog.csdn.net/qingzhuyuxian/article/details/80885623
今日推荐