获取终端窗口的大小(行/列)

有没有可靠的方法来获取当前输出终端窗口的列数/行数?

我想在C / C ++程序中检索这些数字。

我主要是在寻找GNU / Linux解决方案,但也需要Windows解决方案。

Linux / unix:将ioctl与标准输出文件号STDOUT_FILENOTIOCGWINSZ

 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: %d\n", columns); printf("rows: %d\n", rows); return 0; } 

在Linux上,使用以下代码(从这里借用):

 #include  #include  #include  int main (int argc, char **argv) { struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); printf ("lines %d\n", w.ws_row); printf ("columns %d\n", w.ws_col); return 0; // make sure your main returns int } 

在使用libtermcap的GNU / Linux上( https://www.gnu.org/software/termutils/manual/termcap-1.3/html_mono/termcap.html )创建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: %d\n", 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:

 CONSOLE_SCREEN_BUFFER_INFO sbInfo; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbInfo); int availableColumns = sbInfo.dwSize.X; int availableRows = sbInfo.dwSize.Y;