Chinaunix首页 | 论坛 | 博客
  • 博客访问: 214364
  • 博文数量: 24
  • 博客积分: 493
  • 博客等级: 下士
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-28 09:26
个人简介

WangFerry

文章分类

全部博文(24)

文章存档

2012年(8)

2011年(16)

分类: C/C++

2011-03-14 16:12:12

请看下面的代码:
  1. /* file: test.c */
  2. /* 编译环境:gcc 版本 4.2.4 (Ubuntu 4.2.4-1ubuntu) */
  3. #include <stdio.h>

  4. int main(int argc, char **argv)
  5. {
  6.         fprintf(stdout,"this is stdout");
  7.         /*fprintf(stdout,"\n");*/
  8.         fprintf(stderr,"this is stderr\n");
  9.         fprintf(stdout,"\n");
  10.         return 0;
  11. }
仔细考虑一下输出结果......
正确的结果是:
  1. this is stderr
  2. this is stdout
解释如下:
    原理:当进程运行时,系统会为该进程默认打开stdin(标准输入,一般是键盘)、stdout(标准输出,一般是显示器)以及stderr(标准出错,一般是显示器)三个设备。而这里要注意stdout与stderr共用显示器,fprintf采用的是流式输出,在没有"\n"的情况下,fprintf只是把你要打印的数据写到了输出缓冲区中(分为标准输出缓冲区、标准出错缓冲区,它们是不同的),但并不一定真正地写到了显示器上了(除非输出缓冲区已经满了,才会写到真正的设备上)。
    解释:对于上面的代码,首先"this is stdout"被写入标准输出缓冲区中;然后"this is stderr\n"被写到标注出错缓冲区中,并写到显示器设备上(因为有"\n");最后"\n"被添加到标准输出缓冲区中(此时标准缓冲区中的数据为"this is stdout\n"),并写到显示器设备上。为了验证,可以把源代码中的/*fprintf(stdout,"\n");*/去掉注释,然后在运行程序。
    注意:不同的编译器可能结果不同,我用的是gcc 版本 4.2.4 (Ubuntu 4.2.4-1ubuntu)
   
阅读(1784) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~