如何使控制台输出固定到位

时间:2016-09-07 06:58:08

标签: c console curses

我的LAME(v3.99.5)通过在控制台中向上移动x行并覆盖前面的行来在控制台中输出进度。这很酷。

我已经在different post中读到,仅使用"\r"代替"\n"就可以实现单行的此类行为 - 尽管帖子是针对Ruby的,我的系统上的 C 似乎至少相同:

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

int main() {

    time_t t;
    time_t t2;

    time(&t);
    t2 = t;

    printf("%u\r", (unsigned int)t);        
    fflush(stdout);

    while (1) {
        if (t2 - t > 0) {
            time(&t);
            printf("%u\r", (unsigned int)t);        
            fflush(stdout);
        }
        time(&t2);
    }

    return 0;
}

帖子进一步建议curses library可用于使相同的行为成为多行。

C 中的此类代码的样板示例是什么?

3 个答案:

答案 0 :(得分:1)

根据http://falsinsoft.blogspot.com/2014/05/set-console-cursor-position-in-windows.html

视窗:

void SetCursorPos(int XPos, int YPos)
{
    COORD Coord;
    Coord.X = XPos;
    Coord.Y = YPos;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Coord);
}

Linux的:

void SetCursorPos(int XPos, int YPos)
{
    printf("\033[%d;%dH", YPos+1, XPos+1);
}

答案 1 :(得分:0)

您可以使用以下内容:

/!\警告:如果您之前没有调用$(".article_edit").click(); 就停止了curses程序,那么用于启动该程序的终端将会有一种非常奇怪的行为。

endwin()

答案 2 :(得分:0)

@purplepsycho显示的示例有一些问题,在本修订版中解决(与“任何”X / Open Curses实现一起使用):

#include <curses.h>

int main(int argc, char *argv[]) 
{
    filter();
    initscr();

    // init time
    time_t t = 0, t2;
    time(&t2);

    // main loop
    while (1) {
        if (t2 - t > 0) 
        {
            time(&t);

            erase();
            mvprintw(1,1, "%u", (unsigned int)t);
            refresh();
        }
        time(&t2);

    }
    endwin();

    return 0;
}

那是:

  • 使用initscr来初始化curses(PDCurses提供了一个非标准函数Xinitscr,这不是OP的想法:它当然不常用。)
  • 使用erase而不是clear(以避免屏幕闪烁):
      

    clear wclear 例程就像 erase {{ 1}} 下,   但他们也会调用 werase ,以便清除屏幕   完全在下一次调用该窗口的 clearok 时   并从头开始重新粉刷。

  • 使用filter将输出保持在一行上。
    如果终端切换到备用屏幕,屏幕将显示清除。 ncurses有一种解决方法(请参阅filter.c中的ncurses-examples)。

优于wrefresh erase(),在wclrtoeol()之后调用。