Вывод не отображается с помощью usleep до тех пор, пока не будет задан разрыв строки

Я пытаюсь запрограммировать простой эффект «пишущей машинки» на C, где текст появляется по одной букве за раз с задержкой. Вот функция, которая у меня есть:

#include <stdio.h>
#include <unistd.h>

void typestring(const char *str, useconds_t delay)
{
    while (*str) {
        putchar(*(str++));
        usleep(delay);
    }
}

Проблема в том, что текст на самом деле не появляется, пока не отображается \n. Что я делаю не так?


person flarn2006    schedule 22.04.2013    source источник
comment
Меня так много раз предостерегали от использования fflush(), особенно от fflush(stdin), что я вообще отказался от использования fflush().   -  person Rüppell's Vulture    schedule 22.04.2013
comment
Может ли кто-нибудь дать альтернативное решение этой проблемы с пишущей машинкой без использования fflush()?   -  person Rüppell's Vulture    schedule 22.04.2013
comment
Я не знаю, возможно ли это в Windows, но в Linux вы можете использовать <termios.h> и настроить терминал на небуферизацию. посмотри ссылку в моем посте   -  person bash.d    schedule 22.04.2013


Ответы (4)


Вывод на stdout буферизуется. Используя \n, вы форсируете флеш. Если вы хотите изменить это, вам нужно будет изменить настройки терминала (для Linux смотрите здесь) или используйте

void typestring(const char *str, useconds_t delay)
{
    while (*str) {
        putchar(*(str++));
        fflush(stdout);
        usleep(delay);
    }
}
person bash.d    schedule 22.04.2013
comment
Вы имеете в виду stdout? В любом случае, как только я внес это изменение, оно сработало безупречно. Большое спасибо! - person flarn2006; 22.04.2013
comment
Вы должны смыть stdout, а не stdin. - person Rohan; 22.04.2013
comment
Не уверен, но мудрецы много раз предостерегали меня от использования fflush(stdin). - person Rüppell's Vulture; 22.04.2013

Ваш выходной поток мог быть буферизован, '\n' очищает буфер.

Попробуйте fflush(stdout после putchar(), так как

while (*str) {
        putchar(*(str++));
        fflush(stdout);
        usleep(delay);
    }
person Rohan    schedule 22.04.2013

\n неявно заставляет устройство вывода очищать буферизованный ввод. Для сброса вы должны явно использовать fflush:

 fflush(stdout);
person masoud    schedule 22.04.2013

Выходной поток буферизуется, поэтому текст на самом деле не отображается до тех пор, пока не отобразится \n '\n' очищает выходной поток (жесткий сброс), чтобы сделать то же самое, что вы можете вызвать эту функцию [fflush(stdout)].

while (*str) {
        putchar(*(str++));
        fflush(stdout);
        usleep(delay);
    }

или вы можете использовать

while (*str) {
            printf("%c\n",*(str++));
            usleep(delay);
        }
person anshul garg    schedule 22.04.2013