c++ - Ncurses和ostream类方法?

标签 c++

这可能是一个愚蠢的问题,但我会尝试一下。

有没有办法让类方法将 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/

相关文章:

c++ - 如何将此 C++ 模板函数转换为 C 替代函数?

C++ 为什么我的代码将注册表项放在错误的目录中?

C++ 错误 : no match for call to '(Vector3 (double, double, double)'

c++ - 如何抑制来自 g++ 4.5 或更高版本源代码的特定警告?

c++ - 如何将 char 和 char* 附加到现有字符串?

c++ - 将数组(变量)作为模板参数传递

c++ - ld.exe || 无法打开输出文件 bin\Debug\<FILENAME>.exe 权限被拒绝 [C++]

c++ - fn 指针 vector 未显示正确的 size()

c# - 我可以将 IL2CPP(C++ 中间语言)用于非 Unity 应用程序吗?

c++ - 在实现 operator[] 时,我应该如何包括边界检查?