【1.Linux系统下】

一般而言,大家都知道printf是带有行缓冲的函数,printf把打印的消息先输出到行缓冲区,在以下几种情况下:1.程序结束时调用exit(0)/return;2.遇到回车\n,3.调用fflush函数;4.缓冲区满。会自动刷新缓冲区,缓冲区的内容显示到标准输出上。

比如在LINUX系统下,执行如下程序:

#include <stdio.h>
int main(void)
{printf("hello");while(1);return 0;
}

使用GCC编译后执行,发现shell中并没有输出hello,这是因为LINUX系统下,printf把“hello”输出到缓冲区,而此时没有发生缓冲区刷新的4种情况,因此shell中并不会看到hello。但是如果使用printf("hello\n");或者在printf后使用fflush(stdout);那么执行时在shell中就会看到hello输出。

【2.WINDOWS系统下】
同样这段程序,如果在Windows下编译运行(使用VC++6.0),会发现控制台中马上看到hello的输出。分析原因发现,Windows下stdout没有提供缓冲(不知道这个原因是否确切)。比如执行如下程序:

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. printf("hello\n");
  5. printf("buf size is %d\n",stdout->_bufsiz);
  6. while(1);
  7. return 0;
  8. }

可以看到stdout的缓冲区大小为0,这也就意味着,stdout是没有缓冲区的,因此printf输出到stdout,不存在缓冲,这个和LINUX系统中对printf处理的机制是不一样的。

在Windows下,可以使用setbuf函数(https://msdn.microsoft.com/en-us/library/86cebhfs.aspx)来设置缓冲区的方式和大小。

  1. #include <stdio.h>
  2. char buf[512];
  3. int main(void)
  4. {
  5. setvbuf(stdout, buf, _IOLBF, 512);
  6. printf("hello");
  7. while(1);
  8. return 0;
  9. }

使用setbuf函数,把stdout设置为行缓冲,大小为512字节。在VC++6.0中运行该程序,发现不会在控制台中输出hello,如果把缓冲区设置为2个字节大小:setvbuf(stdout, buf, _IOLBF, 2);此时程序的输出为hell,he输出到缓冲区,缓冲区满,刷新缓冲区,控制台看到he,ll输出到缓冲区,缓冲区满,再次刷新,控制台看到ll,o输出到缓冲区,此时缓冲区未满,因此看不到o在控制台输出。

使用如下程序,查看缓冲区的大小,输出结果为512字节

  1. #include <stdio.h>
  2. char buf[512];
  3. int main(void)
  4. {
  5. setvbuf(stdout, buf, _IOLBF, 512);
  6. printf("hello\n");
  7. printf("%d\n",stdout->_bufsiz);
  8. fflush(stdout);
  9. while(1);
  10. return 0;
  11. }

此外,在Windows设置缓冲区的情况下,printf中使用回车符\n是不会刷新缓冲区的。对上述程序,把fflush函数注释掉,在VC++6.0中重新执行,控制台中看不到输出。

Linux和Windows下使用printf的差别相关推荐

  1. linux与windows下开发,Linux 与 Windows下开发感受

    Linux 和 Windows环境下开发各有优点.以下Linux 下使用感受是在Ubuntu11.04,别的发行版还没试过. 至于各自的缺点,都可以通过各种方法,得到或多或少地解决.至于要花费多大的精 ...

  2. Linux和Windows下部署BeetleX服务网关

    有朋友希望写一篇BeetleX服务网关部署到Linux和windows下并以服务的方式运行的介绍文章.接下详细介绍如何做并简单介绍一下网的使用.首先需要在官网(beetlex-io.com)下载对应版 ...

  3. linux和windows下忘记mysql密码的几种找回方法

    linux和windows下忘记mysql密码的几种找回方法 关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦. 方法一(先进入root权限): # /e ...

  4. Linux和Windows下计算文件的Hash值

    Linux和Windows下计算文件的Hash值 MD和SHA简介 MD SHA MD5 SHA1标识文件唯一性 Linux Windows 不需要下载工具,也不需要写代码. MD和SHA简介 MD ...

  5. 从Docker在Linux和Windows下的区别简单理解Docker的层次结构

    上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序.本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的W ...

  6. VLC-3.0.0(Nightly版)在Linux和Windows下的编译步骤详解

    VLC 3.0.0 Compile vlc的编译一直是个大坑,做过音视频开发的不少人想必都踩过,开篇引用官方wiki一句话: Compiling VLC is not an easy task. 本文 ...

  7. linux编译c如何延时,linux和windows下,C/C++开发的延时函数,sleep函数

    简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 在VC中使用带上头文件 #include 在gcc编译器中,使用 ...

  8. git学习笔记——Linux和Windows下git的基本操作

    git学习笔记--Linux和Windows下git的基本操作 github主页:https://github.com/Taot-chen 一.Linux环境 1.安装git sudo apt-get ...

  9. windows4t硬盘Linux分区工具,linux挂载windows下的硬盘分区

    linux挂载windows下的硬盘分区 (2009-10-18 12:37:56) 标签: 电脑 windows linux 硬盘分区 sda it 在linux下挂载windows分区 想随时随地 ...

最新文章

  1. 如何使用vs来运行box2d中Testbed的案例
  2. 【BZOJ 1927】 [Sdoi2010]星际竞速
  3. The alias LM/W3SVC/1/Root/XX already exists. Please choose a different alias
  4. Linux命令学习手册-grep命令
  5. 科研实习 | 约翰霍普金斯大学Alan Yuille教授招收计算机视觉暑期科研实习生
  6. 《鸿蒙理论知识06》HarmonyOS概述之应用开发基础知识
  7. python管理数据库设计_Pycharm+Django+Python+MySQL开发 后台管理数据库
  8. 52 - 算法 - LeetCode 28 - 实现 strStr() -kmp
  9. Codeforces Round #565 (Div. 3) B
  10. mysql隔离性与隔离级别
  11. $(document).ready()方法和window.onload()方法
  12. jetty 找不到html页面,记一次jetty 404问题排查修复
  13. 军用设备环境试验GJB150A-2009检测报告机构
  14. SoapUI安装教程,亲测可用
  15. node项目报错had too many unstable restarts (16). Stopped. “errored”
  16. Named Entity Recognition for Chinese Social Media with Jointly Trained Embedding 笔记
  17. ESP8266-Arduino编程实例-OPT3001数字环境光传感器
  18. confusion_matrix
  19. Leetcode_62_Unique Paths
  20. HTML标签的基本使用:无序列表、有序列表、定义列表

热门文章

  1. gradle的多项目构建(九)
  2. 浅谈分布式存储系统数据分布算法
  3. canal原理的一些学习-2(HA 模式搭建)
  4. 0820-拼多多二面
  5. mysql1231错误_Mysql学习---Python操作Mysql 1231
  6. python是什么和c++是什么区别_c++和python的区别有哪些
  7. 10年老电脑如何提速_告别求人!3个方法教你怎样让你的电脑快的嗖嗖的!
  8. comment desc显示表结构_营销模块数据库表解析(二)
  9. Invalid bound statement (not found)
  10. l2正则化python_机器学习入门之机器学习之路: python线性回归 过拟合 L1与L2正则化...