C/C++ 在控制台下显示进度

news/2024/10/27 22:33:04/

当程序在进行大量的运算或IO操作时,常常需要耗很长时间,为了不让用户有一个乏味的等待或是错误的认为系统已经死机,有必要给程序添加进度提示功能。在窗口界面中要显示进度条和显示完成百分比是非常容易的,但如何在控制台下去完成这个任务了?一行一行的输出当前完成百分比肯定是不够美观的,最好能“原地踏步”一样的显示即旧的数字会被新的数字完全覆盖。其实这个是很容易的,下面先给出的示例代码,稍后再进行讲解。

//在控制台下显示进度
#include <stdio.h>
#include <windows.h>
int main()
{const int NUM  = 50;//任务完成总量for (int i = 0; i < NUM; i++){//用Sleep()来代替一些费时的操作,如读写文件,大量的运算。Sleep(200); //some work to do//输出百分比printf("%.2lf%%\r", i * 100.0/ NUM);}return 0;
}

可以看出,关键是在于\r书上说它是转义字符中的回车符——描述的不是很到位。准确的讲应该是回到本行开始处。

如:printf("123\r100\n");会输出100。printf("12345\r100\n");会输出10045。

来个复杂点的例子:

#include <stdio.h>
int main()
{printf("MoreWindows");printf("12345\r00\n");return 0;
}

会输出什么了?

第一条语句输出MoreWindows,第二条语句输出12345后回到本行的开始处再输出00并换行。这样最开始的二个字符将会被覆盖从而输出00reWindows12345。

再来看一个例子,如下程序运行后将不会输出任何内容。

#include <stdio.h>
int main()
{printf("12345\r");return 0;
}

这是因为上面程序输出和清除之间间隔时间太小,人眼无法察觉。下面这个程序将会让你看清printf()函数执行\r的过程。

#include <stdio.h>
#include <windows.h>
int main()
{char szText[] = "MoreWindows";printf("12345679\r");Sleep(2000);for (int i = 0; i < strlen(szText); i++){putchar(szText[i]);Sleep(200);}putchar('\n');
}

运行后将会看到输出123456789后,光标移到了本行行首并会在1下面闪烁,闪烁时123456789仍在显示屏幕上,2秒后,屏幕将输出依次输出MoreWindows并将原来的123456789覆盖。

 

结语:在控制台显示进度无疑是非常方便的,在很多场合完全可以代替窗口进度条的来美化程序和减小用户等待时的乏味感。

 

转载请标明出处,原方地址:http://blog.csdn.net/morewindows/article/details/6742078


http://www.ppmy.cn/news/132165.html

相关文章

从底层向上理解GPU(GPU驱动的初始化过程)

背景 这一系列的总结本来应该伴随着项目及时的整理的&#xff0c;但是对于显卡驱动而言&#xff0c;本身能够参考的资料就非常的少&#xff0c;只能自己从内核代码中去不对揣摩推敲。项目的目的其实非常的简单粗暴&#xff0c;为什么这么说呢&#xff0c;因为要做的工作包含在嵌…

INA226使用之程序与模块测试

笔者最近有个项目需要测量电流参数&#xff0c;于是买来INA226模块测试一下。 文章目录 应用电路程序设计补充关于Alert引脚的使用补充使用多个INA226的方法 模块测试总结后续 应用电路 首先测试使用的INA226模块如下图所示。 INA226模块原理图如下图所示。 官方手册的参考…

FT2004(D2000)开发实战之AMD HD8570显卡驱动适配

一 AMD显卡驱动概述 Linux内核显卡驱动又叫DRM驱动,目前Linux内核中有两种用于Radeon显卡的DRM驱动:一种是radeon驱动,支持R100 ~ GCN2的各个子系列的显卡,代码位于drivers/gpu/drm/radeon目录;另外一种是amdgpu驱动,支持GCN1 ~ GCN5以及RDNA的各个子系列的显卡,代码位…

在C#程序中三菱PLC读写数据

首先添加引用 三菱PLCdll文件 1、导入 命名空间&#xff1a; using HslCommunication.Profinet.Melsec; 2、声明一个PLC对象&#xff1a; private MelsecMcNet melsecMcNet null; 3、读取PLC地址值 /// /// 读取bool值 /// /// PLC地址&#xff1a;如M100,X100,Y100,B100 //…

STM32使用光敏传感器计算光照度Lux,而不是仅仅打印个电压值或者电阻值

最近项目中用到了光敏电阻。搜索资料&#xff0c;发现很多人都使用光敏电阻&#xff0c;只是用了AD读取了电压值&#xff0c;或者算出了电阻值&#xff0c;就发送给上位机或者服务器&#xff0c;美其名曰获取了光照度。 搜索一番&#xff0c;也没找到用光敏电阻计算Lux的方法&a…

【PaddleClas】手把手让你训练自己的人脸识别模型

【PaddleClas】手把手让你训练自己的人脸识别模型 简介 在这个项目中&#xff0c;我们将介绍如何使用PaddleClas仓库训练我们自己的AdaFace模型&#xff0c;为以后的人脸识别做铺垫。在AIStudio中&#xff0c;项目空间大小只有100G&#xff0c;如果你想要在本地训练更大的数据…

Cadence OrCAD Capture 新放置的元件为问号无法自动编号解决方法

🏡《总目录》   🏡《宝典目录》 目录 1,概述2,三种逻辑及应用范围3,设置方法4,总结B站关注“硬小二”浏览更多演示视频 1,概述 本文介绍OrCAD Capture软件新放置元件的三种编号逻辑。 2,三种逻辑及应用范围 在新加或者复制新的元件时,新元件的编号逻辑有三种: 不…

IAR代码界面配色和字体修改

IAR代码界面配色和字体修改 IAR编写代码的界面实在让人难以恭维&#xff0c;所以就自己改了一下编写代码的界面&#xff0c;让写代码变的没那么难受。 效果图↓↓↓ 打开IAR 点开tools中的options一栏 配置editor中的属性 设置配色方案 展开编辑中colors and fonts&#xf…