昨天在ubuntu下给同学拷贝电影,又遇到了那个蛋疼的问题,切换到别的界面的时候那个进度条的窗口就没有了,总也不知道拷贝的进度。
于是想写一个进度条,如何在程序中写一个简单的进度条呢?
Window下的简单实现:
#include<stdio.h>
#include<string.h>
#include <windows.h>
#define str_len 100
int linepos=0;
const int dotnum=str_len;
char str[str_len+1];
void draw()
{
memset(str,'*',linepos);
str[linepos]='|';
str[linepos+1]='|';
memset(str+linepos+2,'*',str_len-linepos-1);
//可以每次只改变两个字符来完成字符串的更新,此处略了
system("cls"); //清理屏幕
puts(str);
fflush(stdout);
linepos=(linepos+1)%str_len;
}
int main()
{
while(1)
{
draw();
Sleep(100);
}
return 0;
}
这里有个问题,用的system("cls");来清屏,可能会清除别的字符。更多windows console的函数,见Win console
linux下的实现就比较简单了:
#include<stdio.h> #include<string.h> #define str_len 100 int linepos=0; const int dotnum=str_len; char str[str_len+1]; void draw() { memset(str,'*',linepos); //可以每次只改变两个字符来完成字符串的更新,此处略了 str[linepos]='|'; str[linepos+1]='|'; memset(str+linepos+2,'*',str_len-linepos-1); putchar('\r'); //输出字符'\r',回到当前行的起始位置 //这个'\r'在linux下的意义是回到当前行的起始位置,但是在windows下跟'\n'是相同的, puts(str); fflush(stdout); linepos=(linepos+1)%str_len; } int main() { while(1) { draw(); usleep(100); } return 0; }
把这段儿代码在程序中运用,做一个详细点儿的进度条,可以获得好点儿的交互体验。(谁说terminal console就不需要交互体验呢?)