2013-10-26 5 views
0

Я пытаюсь сделать часы на C, но экран неправильно очищается, он просто сохраняет печать на новой строке. Как я неправильно использую fflush?часы с использованием fflush не очищающий экран

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    while (1) { 

     time_t rawtime; 
     struct tm * timeinfo; 

     time (&rawtime); 
     timeinfo = localtime (&rawtime); 
     printf ("%s", asctime (timeinfo)); 
     fflush(stdout); 

    } 
    return 0; 
} 
+0

fflushfflush просто гарантирует, что все, что вы пишете в stdoutstdout, действительно видно. Это не имеет никакого отношения к очистке экрана. Вы можете попробовать добавить строку с '\ r', чтобы переписать вывод в той же строке. –

+0

Если вы хотите очистить экран, вам нужно написать код, чтобы очистить экран. C не предполагает, что у вас есть экран или его можно очистить, поэтому вам придется делать это так, как это подходит для конкретной платформы или терминала, которые у вас есть. –

ответ

2

Это удаляет символ новой строку из строки asctime, а затем использует возврат подтолкнуть курсор обратно к началу линии

#include <string.h> 

int main() 
{ 
     while (1) { 

        time_t rawtime; 
        char st[30]; 
          struct tm * timeinfo; 

            time (&rawtime); 
            timeinfo = localtime (&rawtime); 
            sprintf (st,"%s", asctime (timeinfo)); 
            *(index(st,'\n'))='\0'; 
            printf("\r%s",st); 
            flush(stdout); 
            sleep(1); 

        } 
            return 0; 
} 
+0

нуждается в индексе (st, '\ n') '. ? – ryyker

0

Это сделает это ... (использует злое окно называют SetConsoleCursorPosition(), но делает трюк)

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
void gotoxy(int x, int y); 

int main() 
{ 
    while (1) { 

     time_t rawtime; 
     struct tm * timeinfo; 
     gotoxy(0,0);//set to the upper left hand corner 
     time (&rawtime); 
     timeinfo = localtime (&rawtime); 
     printf ("%s", asctime (timeinfo)); 
     fflush(stdout); 

    } 
    return 0; 
} 

void gotoxy(int x, int y) 
{ 
    COORD pos = {x, y}; 
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleCursorPosition(output, pos); 
} 

Попробуйте для POSIX:

#!/usr/bin/tcc -run 
#include <stdio.h> 
#include <termios.h> 
int main() 
{ 
    struct termios ts0, ts1; 
    char cls [FILENAME_MAX]; 
    FILE *f; 
    f = popen ("tput clear", "r"); 
    fgets (cls, FILENAME_MAX, f); 
    pclose (f); 
    tcgetattr (0, &ts0); 
    ts1 = ts0; 
    ts1.c_lflag &= ~ECHO; 
    ts1.c_lflag &= ~ICANON; 
    tcsetattr (0, TCSAFLUSH, &ts1); 
    fputs (cls, stdout); 
    while (1) putchar (getchar()); 
    tcsetattr (0, TCSAFLUSH, &ts0); 
    return 0; 
} 
+0

У меня нет окон, но я думаю, что ncurses может иметь что-то подобное. –

+0

Не могу сказать из тегов, какую систему вы использовали, но да, (n) проклятия для файлов unix'esk могут сделать трюк. Извините, я не мог помочь :) – ryyker

+0

Ваш ответ дал мне альтернативный способ решения проблемы. Спасибо, также моя система - Mac и Android. –

2

У этого есть то преимущество, что он будет работать из текущего местоположения на экране, независимо от того, что это. Я добавил ярлык для печати «Время:», чтобы показать это. Он делает это путем обратного интервала от конца временной строки, а не переходит в абсолютную позицию или столбец экрана. Caveat: взломать для сна() в Visual C не пробовали.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 
#ifdef _MSC_VER 
    #include <windows.h> 
    #define sleep(T) Sleep((T) * 1000) 
#else 
    #include <unistd.h> 
#endif 

int main(void) 
{ 
    char buf[42]; 
    time_t the_time[1]; 
    int i, len; 

    printf("The time is: "); 
    for (;;) { 
    time(the_time); 
    len = strlen(strcpy(buf, asctime(localtime(the_time)))) - 1; 
    printf("%.*s", len, buf); 
    for (i = 0; i < len; i++) putchar('\b'); 
    fflush(stdout); 
    sleep(1); 
    } 
    return 0; 
} 
+0

Очень приятно, выглядит портативным между Windows и Unix/Linux тоже? – ryyker

+0

@ryyker я так думаю. Но у меня нет Linux под рукой. Windows cmd и mingw bash работают. – Gene

+0

Да, хорошо. И он также работает в Linux, но предупреждает о «* неявной декализации» для 'sleep()', поскольку 'unistd.h' требуется в Linux. Однако почему бы не использовать '' \ b'' вместо '' \ x08''? Может показаться немного более интуитивным. – alk

Смежные вопросы