zoukankan      html  css  js  c++  java
  • linux下printf函数为什么不加 就不能输出相关的内容 ?

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

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

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

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

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


    解决方案:

    方案1、在printf里加" "

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


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

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

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


    下面是测试代码:

    方案1:

    #include<stdio.h>
    #include<unistd.h>
    
    void main()
    {
            int i;
            for(i=0;i<10;i++)
            {
                    printf("
     %d%% is complete.
    ",i);
                    sleep(1);
            }
            printf("
    ");
    }
    


    方案2:

    #include<stdio.h>
    #include<unistd.h>
    
    void main()
    {
            int i;
            for(i=0;i<10;i++)
            {
                    printf("
     %d%% is complete.",i);
                    fflush(stdout);
                    sleep(1);
            }
            printf("
    ");
    }
    


    #include<stdio.h>
    #include<unistd.h>
    
    void main()
    {
            int i;
            setvbuf(stdout,NULL,_IONBF,0); //直接将缓冲区禁止了. 它就直接输出了
            for(i=0;i<10;i++)
            {
                    printf("
     %d%% is complete.",i);
                    sleep(1);
            }
            printf("
    ");
    }
    




  • 相关阅读:
    袁绍的刁难(recruitment.pas/cpp)
    数列分块入门 5 总结
    【五校联考3day1】旅游
    【五校联考3day1】食物
    jzoj 1274. 游历的路线(lines.pas/cpp)
    thinkphp框架开发功能要求
    java中 Bouncycastal库的使用
    Spring+Quartz实现定时任务的配置方法
    java缓存的使用
    Java注解教程:自定义注解示例,利用反射进行解析
  • 原文地址:https://www.cnblogs.com/alan666/p/8312067.html
Copyright © 2011-2022 走看看