2013-04-22 6 views
0

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

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

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

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

+0

Я был предостерегли так много раз против fflush() штучка, особенно fflush (STDIN), что я вышел с помощью fflush() в целом. –

+0

Может ли кто-нибудь дать альтернативное решение этой проблемы с пишущей машиной без использования fflush()? –

+0

Я не знаю, если это возможно в Windows, но в Linux вы можете использовать '' и установить для терминала небуферизацию. Посмотрите ссылку в моем посте –

ответ

3

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

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

Не хотите сказать 'stdout'? В любом случае, как только я сделал это изменение, он работал безупречно. Большое спасибо! – flarn2006

+0

Вы должны очистить 'stdout' не' stdin'. – Rohan

+0

Не уверен, но мудрые здесь предостерегали меня много раз против использования fflush (stdin). –

2

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

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

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

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

fflush(stdout); 
0

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

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

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

while (*str) { 
      printf("%c\n",*(str++)); 
      usleep(delay); 
     }