gpt4 book ai didi

c++ - 是否有(更)合理的方法来确定 ostream 所针对的终端的宽度?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:31 30 4
gpt4 key购买 nike

我有一个函数可以将一些文本打印到它接收到的 ostream&。如果 ostream 以终端为目标,我想让它适应终端宽度,否则默认为某个值。

我现在做的是:

  1. ostream 中获取一个 ofstream
  2. ofstream 中获取一个 FILE*
  3. FILE* 中获取一个整数文件描述符。
  4. 执行 ioctl(file_descriptor, TIOCGWINSZ, &my_struct_winsize);

由于这个 SO 答案,第 1 步和第 2 步带来了:

Getting a FILE* from a std::fstream

但它们不可移植且特定于 GCC(我不确定它们是否适用于 cout/cerr/cin 以外的 ostream)。我能做得更好吗?

最佳答案

这些都不是 gcc 特定的。其余的,TIOCGWINSZ广泛实现并与 POSIX termios ( terminal I/O ) 一起使用,尽管它和相应的 SIGWINCH奇怪的是不在 POSIX 中。其他获取终端宽度的方法(仍然针对POSIX平台,Windows普遍不适用):

  • 测试环境变量 COLUMNSLINES (许多终端应用程序,包括那些使用 curses 的终端应用程序都这样做,例如,参见 use_env ,由任何 X/Open curses 实现提供,例如 ncurses )。
  • 使用 resize 完成的 ECMA-48 光标位置报告程序。

对于 Windows,这些都不适用。您将从控制台 API 调用之一获取信息,例如 GetConsoleScreenBufferInfo . Cygwin 是一个特例,因为它运行(或多或少)与 ioctl 一起工作的类似 POSIX 的应用程序。以及 POSIX 终端 I/O。 MinGW 处于较低级别,并没有在此区域中对控制台 API 提供任何真正的扩展。

进一步阅读:

关于c++ - 是否有(更)合理的方法来确定 ostream 所针对的终端的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35668636/

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