Таймер обновления C без обновления всей консоли - PullRequest
2 голосов
/ 16 марта 2019

У меня есть простая программа, которая:
а) генерирует случайную букву и печатает ее
б) запускает таймер и печатает его (необходимо обновить)
c) проверяет, нажата ли произвольная буква и останавливает ли таймер.

Это код:

if (GetAsyncKeyState(VK_F2) & 0x8000)
        {
            char randLetter = 'A' + (rand() % 26);

            printf("Press:         %c", randLetter);
            statementX = 0;
            beggin = clock();

            while (statementX == 0) {
                end2 = clock();
                result2 = (float)(end2 - beggin) / CLOCKS_PER_SEC;
                printf("%.2f", result2);

                if (GetAsyncKeyState(randLetter)) {
                    end = clock();
                    result = (float)(end - beggin) / CLOCKS_PER_SEC;
                    printf("%f", result);
                    statementX = 1;
                }
                else {};
            }
        };

Вывод, который я хочу получить, например: Нажмите X 5.26

Но фактический результат: Нажмите X 0,01 0,02 0,03 ......

Буду благодарен за любой совет. system(CLS), вероятно, не лучшая идея, потому что она обновляет всю консоль, в результате чего «Press X» исчезает.

1 Ответ

2 голосов
/ 16 марта 2019

Я думаю, что одним из самых простых способов справиться с этим является использование символа возврата \b.

(Для более продвинутых вещей есть http://ascii -table.com / ansi-escape-sequence.php .)

Минималистичный пример (который обновляет конечный номер на месте):

#include <stdio.h>
#include <unistd.h>
int main()
{
    printf("Press X:\t     0 "); fflush(stdout);
    unsigned i=1;
    for(;;i++){
        printf("\b\b\b\b\b\b%5u ", i); fflush(stdout);
        sleep(1);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...