我有一个显示 Ncurses 内容的命令( initscr
、 printw
、 addch
、...)。没关系。
最后( 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/