使用fflush的时钟没有清除屏幕

时间:2013-10-26 04:49:08

标签: c time fflush

我正在尝试用C制作一个时钟,但屏幕没有正确清除,它只是继续打印到一个新行。我如何不正当地使用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;
}

3 个答案:

答案 0 :(得分:2)

这会从asctime字符串中删除换行符,然后使用return将光标推回到行首

#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;
}

答案 1 :(得分:2)

这个有一个优点,它可以在屏幕上的当前位置工作,无论是什么。我添加了一个标签来打印“时间是:”以显示此信息。它通过从时间字符串末尾的后退间距而不是到绝对屏幕位置或列来完成此操作。警告:尚未尝试过在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;
}

答案 2 :(得分: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;
}