有什么方法可以取回输出到 ncurses 变量中的字符吗?
假设我愿意:
printw("test");
然后我希望能够:
somefunc(strbuffer);
printf("%s",strbuffer); // test
我需要一个函数来将屏幕上的所有字符返回到变量中,scr_dump 已关闭,但输出格式不可读..
如果您使用curses函数(例如addch、mvaddch、addstr)将内容放在屏幕上,您可以使用
inchstr
)和相关函数从屏幕读取字符(通过与返回值与进行AND运算来提取它们) A_CHARTEXT
)。
但是,如果您使用 printf 或任何其他非 Curses 方法在屏幕上放置文本(包括对另一个使用 Curses 的程序的系统调用),您将无法读取屏幕内容。
Curses 在内部维护当前屏幕内容,inchstr 函数使用屏幕的内部表示来查找当前内容。
有两组函数用于从屏幕上检索数据。 如果您的
printw
仅使用(如问题中所示)表示为 8 位编码(ASCII、POSIX、ISO-8859-1)的文本,则 inch
和 inchstr
可以工作:
instr
及其变体。 这些函数返回数据,无需额外屏蔽字符的属性。
但是,如果数据使用多字节编码(例如 UTF-8),则必须使用不同的接口来检索字符。 这些相当于
inch
和 inchstr
:
复杂字符是一种结构,X/Open Curses 将其视为不透明。 您必须使用
getcchar
从每个单元格的数据中提取数据(例如宽字符字符串)。
A(一点)更简单一点,你可以从窗口中读取宽字符字符串信息:
inwstr
等 - 从curses窗口获取一串wchar_t
字符没有单字符形式;您必须以单字符字符串的形式检索数据。
总而言之,虽然您的应用程序可以将数据作为
char
(或单个 chtype
值)数组放置,但在 UTF-8 环境中,它必须将其检索为 复杂字符 或 宽字符。 如果您碰巧使用 Linux,通常可以将 wchar_t
视为 Unicode 值。 将数据作为 wchar_t
值的数组给出,您可以使用其他(非curses)函数来获取多字节(UTF-8)字符串。
由于问题说的是 ncurses 而不是简单地 curses,因此有必要指出使用 ncurses 的应用程序与 X/Open Curses 的不同之处在于它们在屏幕上放置数据的方式(这可能会影响您对检索数据的期望) 。 在 ncurses 中,
addch
(以及类似的面向 char
的函数)将处理多字节字符串(例如 UTF-8)中的字节,并将结果存储为宽字符。 迄今为止,其他 X/Open Curses 实现都没有这样做。 其他人将这些字节视为独立的,并可能将它们表示为无效的宽字符。
顺便说一句,自从2010年提出这个问题以来,ncurses的
scr_dump
格式已经扩展,使其“可读”。
正如其他答案中提到的,您可以使用
inch(int)
或 mvinch(int, int)
方法,并将 &
与 A_CHARTEXT
这是之前答案中缺少的一些示例代码
int row = 0;
char buffer[101];
/* Read first 100 characters from row 0 */
for (int i = 0; i < 100; ++i) {
buffer[i] = mvinch(row, i) & A_CHARTEXT;
}
buffer[100] = '\0';