gpt4 book ai didi

c - 在终端中实现覆盖

转载 作者:行者123 更新时间:2023-11-30 19:34:36 24 4
gpt4 key购买 nike

我想在终端中创建一个叠加层

此问答在右侧/底部显示时间

#include <stdio.h>
#include <stdlib.h>
#include <termcap.h>
#include <termios.h>
#include <error.h>
#include <unistd.h>
#include <time.h>

static char termbuf[2048];

int main()
{
char *termtype = getenv("TERM");

time_t timer;
char buffer[26];
struct tm* tm_info;

if (tgetent(termbuf, termtype) < 0) {
error(EXIT_FAILURE, 0, "Could not access the termcap data base.\n");
return 1;
}

int lines = tgetnum("li");
int columns = tgetnum("co");
int pos=1;
while (1) {
time(&timer);
tm_info = localtime(&timer);
strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
printf("\033[s");
fflush(stdout);

printf("\033[%d;%dH%s\n", lines - 2, columns - 20, buffer);
printf("\033[u");
sleep(1);
}
return 0;
}

它是用以下内容编译的:

$ gcc time-overlay.c -ltermcap -o time-overlay

并使用它:

$ ./time-overlay &

它将显示:

                                                    2017-04-29 12:29:15

并保持更新时间。

停止:

$ fg
Ctrl+C

但是,对于一些抽象低级调用的库(例如保存恢复光标位置或在某些行/列中打印)是否有更好的方法来做到这一点

我想保留现有的终端输出(因此带有 initscr() 的诅咒将不起作用)

最佳答案

这就是使用 termcap 的方式(或者任何提供 termcap 接口(interface)的东西,例如 ncurses):

#include <stdio.h>
#include <stdlib.h>
#include <termcap.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

#define MAXTERM 2048
#define EndOf(s) (s) + strlen(s)

int
main(void)
{
char termbuf[MAXTERM];
char workbuf[MAXTERM];
char *working = workbuf;

int lines, columns;
char *save_cursor, *move_cursor, *restore_cursor;

if (tgetent(termbuf, getenv("TERM")) < 0) {
fprintf(stderr, "Could not access the termcap database.\n");
return EXIT_FAILURE;
}

lines = tgetnum("li");
columns = tgetnum("co");
save_cursor = tgetstr("sc", &working);
move_cursor = tgetstr("cm", &working);
restore_cursor = tgetstr("rc", &working);

while (1) {
time_t timer;
char buffer[1024];
struct tm *tm_info;

time(&timer);
tm_info = localtime(&timer);

strcpy(buffer, save_cursor);
sprintf(EndOf(buffer), tgoto(move_cursor, columns - 20, lines - 2));
strftime(EndOf(buffer), 26, "%Y-%m-%d %H:%M:%S", tm_info);
strcat(buffer, restore_cursor);

write(fileno(stderr), buffer, strlen(buffer));
sleep(1);
}
return EXIT_SUCCESS;
}

它仍然可以改进,因为从 tgetstr 返回的各种字符串不能保证由所有终端描述提供,当然,termcap 应用程序总是有缓冲区 -需要解决溢出问题。

关于c - 在终端中实现覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43694525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com