c++ - 如何管道/重定向 NCurse 命令的最终标准输出?

标签 c++ unix ncurses

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

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

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

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

有办法允许吗? 谢谢。

最佳答案

使用 newterm(),而不是 initscr()。如果您已经在使用 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;
}

关于c++ - 如何管道/重定向 NCurse 命令的最终标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71626672/

相关文章:

c++ - 许多功能的单个 DLL 入口点

c - 使用 scanf 获取字符串来创建并针对 while 循环验证它...继续获取

无法从 NCURSES 中的标准输入扩展 ASCII 字符读取

c++ - Ncurses:创建下一个窗口后无法在上一个窗口中写入

c++ - Linux下的服务,一种现代方法?

c++ - MFC 64 位代码在 Windows Server 2008 R2 上比 32 位慢

android - 使用 MediaCodec API JNI 解码 H.264 流

c - 通过杀死其父进程而成为孤儿的子进程不会被 init 收养。我该如何解决?

regex - 如何批量将前置年份移动到文件名的末尾?

linux - bash:从动态文件创建一个 ncurses 对话框单选列表并将选择输出到变量