首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于printf的刷新输出问题??
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangjgbupt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2007-08-04 13:22:32 楼主
    书上都说printf在输出字符串的时候,只有在字符串的最后有‘\n’,或者调用函数fflush(),或紧跟着printf后有scanf之类的,字符串才会显示,但是我发现即使没有这些条件,它一样正常显示呀,那个高手给解释一下。
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • comman_ndsc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 13:35:521楼 得分:0
    printf的刷新输出???有
    ------------------------
    没听过这种说法啊!


    书上都说printf在输出字符串的时候,只有在字符串的最后有‘\n’...
    ------------------------------------------------------------------
    如果单单说输出字符串的话,我想应该是判断到 '\0 '的时候,显示,
    printf   ()函数主要还是用在格式输出上,没有像楼主说的那么复杂啊。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangjgbupt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 13:41:162楼 得分:0
    有呀,输出都有缓冲区的,这个和缓冲区有关系,也就是说:按照书上说得,在遇到‘\n’,或者调用函数fflush(),或紧跟着printf后有scanf之类的,这三种情况就会刷新缓冲区,进而才能在显示出来
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cceczjxy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

      2

    发表于:2007-08-04 13:49:533楼 得分:0
    有呀,输出都有缓冲区的,这个和缓冲区有关系,也就是说:按照书上说得,在遇到‘\n’,或者调用函数fflush(),或紧跟着printf后有scanf之类的,这三种情况就会刷新缓冲区,进而才能在显示出来

    -------------------------------------------
    这些情况是可用立即输出的,不过还有情况是你把输出设置成不缓冲,或则缓冲区设置的非常小.也会立即输出的
    .在输出是,遇到缓冲区满了也会立即输出的.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • comman_ndsc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 13:53:054楼 得分:0
    是有输入输出缓冲区一说
    fflush(stdout)可以用来刷新(清空)标准输出缓冲区。
    scanf()是刷新标准输入缓冲区

    但这和printf   ()能是否显示是没有关系的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangjgbupt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 14:01:345楼 得分:0
    printf   ()能是否显示是没有关系的。
    -----------------
    先将字符串输出到缓冲区,如果缓冲区满了就从缓冲区输出到标准输出设备上。
    是不是编译器默认的不缓冲呀???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • comman_ndsc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 14:16:056楼 得分:0
    printf将输出的数据传递给一个被称为缓冲区(buffer)的中介存储区域,缓冲区中的内容再向屏幕传输.
    C规定缓冲区中的内容在如下三种情况向屏幕传输:缓冲区满,遇到换行符的时候或者需要输入的时候.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangjgbupt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 14:30:187楼 得分:0
    对,是这意思,但是即使不满足这三种情况照样可以显示在屏幕上呀,我觉得是不是编译器默认不缓冲?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Chiyer
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      4

      4

    发表于:2007-08-04 14:40:188楼 得分:0

    printf   无缓冲,cout   有缓冲;
    缓冲刷新的时刻有:
    1.   缓冲区满;
    2.   输出   endl;
    3.   显式调用   flush   函数;
    4.   程序结束时。



    C   中缓冲设置相关的函数:setbuf()



    cout.setf(ios::stdio);
    上述语句让   iostream   和   stdio   共用一个缓冲。



    程序1:
    ////////////////////////////////////
    #include   "iostream.h "
    #include   "stdio.h "

    int   main()
    {
            cout   < <   "ok1 ";
            printf( "%s ",   "ok ");
            cout   < <   "ok2 ";

            return   0;
    }
    ////////////////////////////////////

    程序1在   vc   6.0   里的输出结果为:
    okok1ok2
    其原因是:cout   < <   "ok1 ";   的时候没有刷新缓冲区,而   printf   输出后就刷新了。当   cout   < <   "ok2 ";   的时候,缓冲仍然没有被刷新。直到退出程序的时候,iostream   才刷新它的缓冲。所以   cout   的输出在   printf   后面。如果要顺序输出的话,在   cout   语句最后加上   < <   endl   (cout   < <   "ok1 "   < <   endl;),endl   会刷新缓冲的。

    在   gcc   和   vs.net   中的输出正常,如下:
    ok1okok2

    程序2:
    ////////////////////////////////////
    #include   "iostream.h "
    #include   "stdio.h "

    int   main()
    {
            cout   < <   "ok1 ";    
            printf( "%s ",   "ok ");    
            cout   < <   "ok2 ";
            for   (int   i   =   1;   i   =   1;   )
            {
                    ;
            }

            return   0;
    }
    ////////////////////////////////////

    程序2在   vc   6.0   里的输出结果为:
    ok
    其原因是:程序最后有个无限循环,所以cout没有机会被刷新(一般程序退出的时候   cout   会被刷新缓冲)。

    在   gcc   和   vs.net   中的输出正常,如下:
    ok1okok2



    在多线程中用   printf   的话,其中的内容往往能在一个时间片内输出;而如果用   cout   的话,就不能够保证是否能在一个时间片内输出,即使加了   flush   或   endl   也一样。  
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • comman_ndsc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 14:56:159楼 得分:0
    对,是这意思,但是即使不满足这三种情况照样可以显示在屏幕上呀,我觉得是不是编译器默认不缓冲?
    ---------------------------------------------------------------------------------------

    可以把输出设置为不缓冲的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangjgbupt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 15:41:1610楼 得分:0
    那为什么在在   gcc   和   vs.net   中的输出正常输出会正常呢???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qualcommbrew
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-08-04 16:15:5111楼 得分:0
    本人刚建一qq   39599204群(印证码   :C语言)   让有兴趣共同学习、共同提高、共同分享的同志加入。分享笔试、面试题让我们都可以拿高薪   哈哈   (欢迎上传面试,笔试题)本群建立48小时   还有22个名额   满了就没了   不会主动替人   请量解。哈哈
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iambic
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      4

      3

    发表于:2007-08-04 16:22:4112楼 得分:0
    程序结束了会自动刷出缓冲区的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mymtom
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2007-08-04 17:47:3613楼 得分:0
    楼主可以在Unix/Linux下试试下面的程序:
    #include   <stdio.h>
    #include   <unistd.h>

    int   main(void)
    {
                    (void)printf( "Hello! ");
                    fork();
                    return   0;
    }

    在fork之前加flush(stdout);
    或者(void)printf( "Hello! ");   给为(void)printf( "Hello!\n ")
    然后比较一下输出就明白了.
    修改 删除 举报 引用 回复