我有一個顯示 Ncurses 內容的命令(initscr, printw, addch, ...)。沒關系。
最后(endwin),我想“輸出”(std::cout << "some string")一個字串,由其他命令處理(或者可能重定向到一個流)。我想做這樣的事情:
my-ncurse-command | any-other-command
my-ncurse-command > some-stream
問題是:我的 ncurses 顯示被管道或重定向捕獲,而不僅僅是最終字串。
有沒有辦法允許這樣做?謝謝。
uj5u.com熱心網友回復:
而不是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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452544.html
