linux下printf函数为什么不加\n就不能输出相关的内容 ?
2024-09-01 19:47:12
转载请注明出处: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");
}
最新文章
- 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数
- 【linux错误解决】MySQL远程连接ERROR 2003 (HY000):Can&#39;t connect to MySQL server on&#39;XXXXX&#39;的问题
- Project interpreter not specified(eclipse+pydev)
- schedule vs scheduleAtFixedRate
- ubuntu安装nVidia驱动,遇到终端闪砾问题并解决
- (iOS)开发中收集的小方法
- 敏捷冲刺每日报告——Day5
- MATLAB三点确定圆
- week3
- 类似于c语言读取文件进行解析
- gxx -L和/etc/ld.so.conf的理解
- 《Windows核心编程》第3章——深入理解handle
- android asmack调用MultiUserChat.getHostedRooms方法出现空指针的异常解决方案
- JPA的多表复杂查询
- 根据城市表生成json数据
- mui --- 怎么获取百度地图定位功能
- C#对json数据的解析
- from VC的IDE使用技巧大全
- e586. Drawing Simple Shapes
- 字符编码:ASCII,Unicode和UTF-8
热门文章
- tcp ip协议笔记(1)——简单介绍
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database &;#39;user&;#39;
- Vue 字面量语法 vs 动态语法
- (学习笔记3)BMP位图的读取与显示
- jquery+css 实现即时变化颜色主题(通过input输入颜色值进行改变)
- mysql 查看当前连接数
- 【转】Windows2008上传大文件的解决方法(iis7解决上传大容量文件)
- Ubuntu 16.04下配置Golang开发环境
- Kubernetes基本概念之Label
- mysql 中的增改查删(CRUD)