Итак, я обернул код до этого, и вот чем я закончил.
Я использовал немного понятия oop
и смоделировал класс ProgressBar
. Вот как я разработал код для ProgressBar
:
struct tagProgressBarData
{
unsigned long nMaxLen;
unsigned long nCurLen;
char FillChr;
char EmptyChr;
char LeftMargin;
char RightMargin;
};
typedef struct tagProgressBarData PBD;
void InitProgressBar(PBD* p, unsigned long MaxLen, char Left, char Right, char Fill, char Empty);
void DrawProgressBar(PBD* p);
Прежде чем переходить к определениям InitProgressBar()
и DrawProgressBar()
, вот как вы должны использовать то, что я сделал. Вот пример:
int main()
{
PBD data;
/** You can chose other characters and change the length too! */
InitProgressBar(&data, 50, '[', ']', '#', '.');
/** Now we do something which takes some time. */
/** Let's just calculate some random cubes. */
/** The N you talked about. */
unsigned int N;
printf("How many numbers to compute: ");
scanf("%u", &N);
printf("Calculating the cubes of the first %u numbers.\n", N);
DrawProgressBar(&data);
for(unsigned int i = 1; i <= N; i++)
{
unsigned int CubeResult = i*i*i;
unsigned long nProgress = ( ((unsigned long long)i) * data.nMaxLen) / N;
if (nProgress != data.nCurLen)
{
data.nCurLen = nProgress;
DrawProgressBar(&data);
}
}
return 0;
}
А теперь, определение функции, которая печатает индикатор выполнения:
void DrawProgressBar(PBD* p)
{
/** Move to the beginning of the line. */
printf("\r");
/** Print the left margin char. */
printf("%c", p->LeftMargin);
/** Make sure that MaxLen >= CurLen */
if (p->nMaxLen < p->nCurLen)
p->nCurLen = p->nMaxLen;
/** Print the progress with the Fill char. */
for(unsigned long i = 0; i < p->nCurLen; i++)
printf("%c", p->FillChr);
/** Complete whats left with the Fill char. */
for(unsigned long i = 0; i < p->nMaxLen - p->nCurLen; i++)
printf("%c", p->EmptyChr);
/** Print the right margin char. */
printf("%c", p->RightMargin);
}
Я также использовал эту функцию, чтобы сделать свой код в основном более компактный:
void InitProgressBar(PBD* p, unsigned long MaxLen, char Left, char Right, char Fill, char Empty)
{
p->nMaxLen = MaxLen;
p->nCurLen = 0;
p->LeftMargin = Left;
p->RightMargin = Right;
p->FillChr = Fill;
p->EmptyChr = Empty;
}
Если вы хотите иметь какой-либо текст перед индикатором выполнения, но в той же строке (что-то вроде Progress: [######.............]
), вам нужно заменить printf("\r");
из DrawProgressBar()
с for
l oop, чтобы вы точно вернулись на длину индикатора выполнения.
Также вам понадобится некоторая переменная (скажем, bDrawn
), которая сообщит вам, если индикатор выполнения был нарисован хотя бы один раз, так что for для l oop не будет перемещать курсор над существующим текст слева от индикатора выполнения.