由进度条程序引发的问题

来源:互联网 发布:centos7 nginx 访问 编辑:程序博客网 时间:2024/06/03 19:02

在写这个函数下我们先进行一些铺垫工作,我们先来看一下fflush()函数

#include <stdio.h>  int main(){char c;scanf("%c", &c);printf("%d\n", c);scanf("%c", &c);printf("%d\n", c);return 0;}

输入1运行结果是:

49

10

看到这里肯定很多人觉得很惊讶,其实自己想想,1的ASCILL码就是49,回车的ASCILL码是10,所以结果是这样,可见缓冲区里的数据输入到scanf里了,这个时候就需要用到fflush(),它的功能就是清空缓冲区

再来看一下\r和\n的区别
#include <stdio.h>  void Testn(){printf("Testn()::Hello World!\n");}void Testr(){printf("Testr()::Hello World!\r");}int main(){Testn();Testr();system("pause");return 0;}
运行结果:
Testn()::Hello World!
请按任意键继续!

只输出了一个并且是Test()的,由此可以判别出来\r和\n的区别,\r功能回到当前行的开头却不移向下一行;\n功能就是光标移到下一行却不会移到这一行的开头
顺便提一下键盘Enter按下后执行\n\r,这就是Enter真正做的事情

有了这些基础知识,接下来进入我们的正题
#include<iostream>#include<windows.h>using namespace std;int main(){char bar[102];memset(bar, 0, sizeof(bar));const char *lable = "|/-\\";for (size_t i = 0; i <= 100; i++){int tmp = i;if (tmp > 4)tmp = tmp % 4;switch (tmp){case 1:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);break;case 2:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);break;case 3:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);break;case 4:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);break;default:break;}printf("[%s][%d%%][%c]\r", bar, i, lable[i % 4]);fflush(stdout);bar[i] = '#';Sleep(100);}printf("\n");return 0;}
运行截图:


这里还用了Windows给的接口,输出的还是变色的,欢迎来试一试!