gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:40:37 26 4
gpt4 key购买 nike

我有一个显示 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/

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