0

我正在尝试在 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;
}
4

3 回答 3

2

这个的优点是它可以从屏幕上的当前位置开始工作,不管那是什么。我添加了一个标签来打印“时间是:”以显示这一点。它通过从时间字符串的末尾向后间隔而不是转到绝对屏幕位置或列来做到这一点。警告:尚未尝试在 Visual C 下获取 sleep() 的技巧。

#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;
}
于 2013-10-26T05:43:27.807 回答
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;
}
于 2013-10-26T05:20:07.597 回答
0

这样就可以了...(使用邪恶的 windows 调用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;
}
于 2013-10-26T05:24:16.867 回答