这可能是一个愚蠢的问题,但我会尝试一下。
有没有办法让类方法将 ostream 对象作为参数输出到 Ncurses 窗口?
最佳答案
首先,我们应该利用 std::streambuf。这是一个非常简单的示例,仅将 std::cout 重定向到简单的打印机
#include <streambuf>
#include <iostream>
class ncursesbuf: public std::streambuf {
public:
ncursesbuf() {}
virtual int overflow(int c) {
printf("'%d'\n", c);
}
};
class ncurses_stream : public std::ostream {
public:
ncursesbuf tbuf_;
std::ostream &src_;
std::streambuf * const srcbuf_;
ncurses_stream(std::ostream &o) : src_(o), srcbuf_(o.rdbuf()), std::ostream(&tbuf_) {
o.rdbuf(rdbuf());
}
~ncurses_stream() {
src_.rdbuf(srcbuf_);
}
};
int main(int argc, char **argv) {
std::cout << "hello world\n";
{
ncurses_stream foo(std::cout);
std::cout << "hello world\n";
}
std::cout << "back to original state\n";
return 0;
}
然后我们可以修改它以使用 ncurses
#include <streambuf>
#include <ncurses.h>
#include <iostream>
class ncursesbuf: public std::streambuf {
public:
ncursesbuf() {}
virtual int overflow(int c) {
printw("%c", c);
}
};
class ncurses_stream : public std::ostream {
public:
ncursesbuf tbuf_;
std::ostream &src_;
std::streambuf * const srcbuf_;
ncurses_stream(std::ostream &o) : src_(o), srcbuf_(o.rdbuf()), std::ostream(&tbuf_) {
o.rdbuf(rdbuf());
}
~ncurses_stream() {
src_.rdbuf(srcbuf_);
}
};
int main(int argc, char **argv) {
/* ncurses setup */
initscr();
ncurses_stream foo(std::cout);
std::cout << "hello world\n";
refresh();
sleep(5);
endwin();
return 0;
}
关于c++ - Ncurses和ostream类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126649/