有没有可靠的方法来获取当前输出终端窗口的列数/行数?
我想在C / C ++程序中检索这些数字。
我主要是在寻找GNU / Linux解决方案,但也需要Windows解决方案。
Linux / unix:将ioctl
与标准输出文件号STDOUT_FILENO
和TIOCGWINSZ
。
struct winsize size; ioctl(STDOUT_FILENO,TIOCGWINSZ,&size); /* size.ws_row is the number of rows, size.ws_col is the number of columns. */
此外,虽然我在过去5年没有触摸过Windows,但GetConsoleScreenBufferInfo
应该可以帮助您获得当前的控制台大小。
在Windows上,使用以下代码打印控制台窗口的大小(从此处借用):
#include int main(int argc, char *argv[]) { CONSOLE_SCREEN_BUFFER_INFO csbi; int columns, rows; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; printf("columns: %dn", columns); printf("rows: %dn", rows); return 0; }
在Linux上,使用以下代码(从这里借用):
#include #include #include int main (int argc, char **argv) { struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); printf ("lines %dn", w.ws_row); printf ("columns %dn", w.ws_col); return 0; // make sure your main returns int }
在使用libtermcap的GNU / Linux上( )创建demo.c:
#include #include #include #include static char term_buffer[2048]; void init_terminal_data (void) { char *termtype = getenv ("TERM"); int success; if (termtype == NULL) fprintf (stderr, "Specify a terminal type with `setenv TERM '.n"); success = tgetent (term_buffer, termtype); if (success < 0) fprintf (stderr, "Could not access the termcap data base.n"); if (success == 0) fprintf (stderr, "Terminal type `%s' is not defined.n", termtype); } int main () { init_terminal_data (); printf ("Got: Lines: %d, Columns: %dn", tgetnum ("li"), tgetnum ("co")); return 0; }
然后用gcc -o demo.x demo.c -ltermcap
编译并运行以给出:
$ ./demo.x Got: Lines: 24, Columns: 80
我怀疑这在Windows上有多大帮助,但我不知道那个平台。
(部分代码直接从termcap文档中复制。)
为Windows扩展@herohuyongtao答案。 .srWindow属性给出了控制台窗口大小的答案,即可见的行和列。 这并没有说明实际可用的屏幕缓冲区宽度和高度是多少,如果窗口包含滚动条,则可能更大。 如果是这种情况,请使用.dwSize:
需要了解更多c/c++开发分享获取终端窗口的大小(行/列),也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
CONSOLE_SCREEN_BUFFER_INFO sbInfo; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbInfo); int availableColumns = sbInfo.dwSize.X; int availableRows = sbInfo.dwSize.Y;
以上就是c/c++开发分享获取终端窗口的大小(行/列)相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980636.html