linux下printf函数为什么不加\n就不能输出相关的内容 ?
转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/53255970
原因: 输出缓冲区的问题.
unix上标准输入输出都是带有缓存的,一般是行缓存。
对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。
ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数没有带'\n'是不会自动刷新输出流,直至缓存被填满。
解决方案:
方案1、在printf里加"\n"
方案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("\r %d%% is complete.\n",i);
- sleep(1);
- }
- printf("\n");
- }
方案2:
- #include<stdio.h>
- #include<unistd.h>
- void main()
- {
- int i;
- for(i=0;i<10;i++)
- {
- printf("\r %d%% is complete.",i);
- fflush(stdout);
- sleep(1);
- }
- printf("\n");
- }
- #include<stdio.h>
- #include<unistd.h>
- void main()
- {
- int i;
- setvbuf(stdout,NULL,_IONBF,0); //直接将缓冲区禁止了. 它就直接输出了
- for(i=0;i<10;i++)
- {
- printf("\r %d%% is complete.",i);
- sleep(1);
- }
- printf("\n");
- }
linux下printf函数为什么不加\n就不能输出相关的内容 ?的更多相关文章
- Linux下printf函数显示不同的颜色(转)
Linux下printf函数显示不同的颜色 在学习Linux网络编程的时候做一个聊天系统,当时为了界面更漂亮点,于是搜索了下关于printf()函数的用法,给printf的输出加上些特效比如颜色,可以 ...
- Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- linux下syscall函数,SYS_gettid,SYS_tgkill
出处:http://blog.chinaunix.net/uid-28458801-id-4630215.html linux下syscall函数,SYS_gettid,SYS_tgkill ...
- 对于linux下system()函数的深度理解(整理)
原谅: http://blog.sina.com.cn/s/blog_8043547601017qk0.html 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同 ...
- 转:对于linux下system()函数的深度理解(整理)
这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...
- (笔记)Linux下system()函数的深度理解(整理)
注:从其它地方转的非常好的一篇文章,值得深究! 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数 ...
- linux select函数:Linux下select函数的使用详解【转】
本文转载自;http://www.bkjia.com/article/28216.html Linux下select函数的使用 Linux下select函数的使用 一.Select 函数详细介绍 Se ...
- 【C/C++】Linux下system()函数引发的错误
http://my.oschina.net/renhc/blog/54582 [C/C++]Linux下system()函数引发的错误 恋恋美食 恋恋美食 发布时间: 2012/04/21 11:3 ...
- [转帖]Linux下fork函数及pthread函数的总结
Linux下fork函数及pthread函数的总结 https://blog.csdn.net/wangdd_199326/article/details/76180514 fork Linux多进程 ...
随机推荐
- react request.js 函数封装
1.request.js 函数封装 import { Toast } from 'antd-mobile'; import axios from 'axios'; import store from ...
- 关于 AlphaGo 论文的阅读笔记
这是Deepmind 公司在2016年1月28日Nature 杂志发表论文 <Mastering the game of Go with deep neural networks and tre ...
- struts1.3中使用DispatchAction的一个问题
近期做项目发现我们公司的项目是用struts1写的,在多方百度下,总有理解了struts1.3的DispatchAction的使用方法 一:struts.xml文件的配置 <?xml versi ...
- Unity3D游戏开发之简单的碰撞检測
在"Project"面板中单击"Create"旁边的小三角,选择"javascript"创建一个名为"collision" ...
- Thrift安装介绍
一.简介 1.语言库要求 因为thrift支持多语言.所以编译thrift源代码的过程中,会用到该语言的一些类库.如c++的boost.java的jdk等. 那么,在安装thrift过程中,须要对各种 ...
- kubectl技巧之通过jsonpath截取属性
系列目录 前面一节我们介绍了使用go-template截取属性,go-template功能非常强大,可以定义变量,使用流程控制等,这是jsonpath所不具备的.然而,jsonpth使用的时候更为灵活 ...
- Clustering of residential areas based on residential conditions
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3hpYW5neXVpYm0=/font/5a6L5L2T/fontsize/400/fill/I0 ...
- Android 调用QQ登录
调用QQ登录 在如今的项目开发.调用第三方登录.差点儿是必须的,而调用QQ登录也是不可缺少的,这里把相关代码分享出来,希望能拿去就能够用,降低项目开发的时间.希望对大家实用. 1,去QQ ...
- 分布式流媒体直播服务器系统 For Linux
在之前的一篇<基于Darwin实现的分布式流媒体直播服务器系统>中,我们配置了在Win32下面的流媒体直播系统,今天我们分享一下在Linux下面EasyDSS分布式直播服务器系统的配置. ...
- innodb的锁和高并发
1 innodb的锁 1.1 s锁,即读锁,即share锁 1.2 x锁,即写锁,排他锁 1.3 s锁和x锁之间的关系 多个读锁可以共存,但是读锁不可以和写锁共存.写锁和写锁不可以共存. 1.4 间隙 ...