• 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("
    ");
    }
    




  • 相关阅读:
    HashMap源码分析
    Vector和Stack源码分析/List集合的总结
    LinkedList源码分析
    ArrayList源码分析
    第三章 数据链路层(三)
    Java常考面试题(五)
    hibernate(一) 第一个hibernate工程
    回想过去,展望未来
    “Cannot load php5apache2_4.dll into server”问题的解决方法
    win7下80端口被(Pid=4)占用的解决方法
  • 原文地址:https://www.cnblogs.com/alan666/p/8312067.html
Copyright © 2020-2023  润新知