如何 pipe/redirect NCurse 命令的最终标准输出?

How to pipe/redirect the final stdout of a NCurse command?

我有一个显示 Ncurses 内容的命令(initscrprintwaddch、...)。没关系。

最后(endwin),我想“输出”(std::cout << "some string")一个字符串以供其他命令处理(或者可能重定向到流)。 我想要做这样的事情:

my-ncurse-command | any-other-command
my-ncurse-command > some-stream

问题是:我的 ncurses 显示被管道或重定向捕获,而不仅仅是最终字符串。

有没有办法允许这样做? 谢谢。

而不是 initscr(),使用 newterm()。如果您已经在使用 newterm,只需提供与 stdout.

不同的输出流即可

initscr() 等同于:

#include <cstdlib>

WINDOW* myinitscr() {
    newterm(getenv("TERM"), stdout, stdin);
    return stdscr;
}

所以

#include <cstdio>
#include <cstdlib>

std::FILE* cursesout{};
WINDOW* myinitscr() {
    cursesout = std::fopen("/dev/tty", "w");   // open new stream to your terminal
    if(cursesout) newterm(std::getenv("TERM"), cursesout, stdin);
    return stdscr;
}

endwin()之后:

std::fclose(cursesout);

或者,使用智能指针不必手动 std::fclose 新的输出流:

#include <cstdio>
#include <cstdlib>
#include <memory>

using FILE_ptr = std::unique_ptr<FILE, decltype(&std::fclose)>;
FILE_ptr cursesout{nullptr, nullptr};

WINDOW* myinitscr() {
    cursesout = FILE_ptr(std::fopen("/dev/tty", "w"), &std::fclose);
    if(cursesout) newterm(std::getenv("TERM"), cursesout.get(), stdin);
    return stdscr;
}

不使用标准库函数地址的版本(这是被严格禁止的)可能如下所示:

#include <cstdio>
#include <cstdlib>
#include <memory>

using FILE_ptr = std::unique_ptr<FILE, void (*)(FILE*)>;
FILE_ptr cursesout{nullptr, nullptr};

WINDOW* myinitscr() {
    cursesout = FILE_ptr(std::fopen("/dev/tty", "w"), [](FILE* fp) {
        std::fclose(fp);
    });
    if(cursesout) newterm(std::getenv("TERM"), cursesout.get(), stdin);
    return stdscr;
}