我的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 中的此类代码的样板示例是什么?
答案 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
将输出保持在一行上。 filter.c
中的ncurses-examples)。优于wrefresh
erase()
,在wclrtoeol()
之后调用。