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

Vit*_*meo 20 c c++ shell terminal

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

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

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

her*_*tao 29

在Windows上,使用以下代码打印控制台窗口的大小(从此处借用):

#include <windows.h>

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;
}
Run Code Online (Sandbox Code Playgroud)

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

#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

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
}
Run Code Online (Sandbox Code Playgroud)

  • 有跨平台解决方案的机会吗? (3认同)
  • @Raymond,您可以使用“#ifdef WIN32”、“#else”、“#endif”行(或类似的内容)来实现跨平台解决方案。这适用于“#include”和“代码块”。 (2认同)

Mos*_*ieb 21

Linux/unix:使用ioctl(2)标准输出文件编号TIOCGWINSZGetConsoleScreenBufferInfo().


#include <sys/ioctl.h> //ioctl() and TIOCGWINSZ
#include <unistd.h> // for STDOUT_FILENO
// ...

struct winsize size;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &size);

/* size.ws_row is the number of rows, size.ws_col is the number of columns. */

// ...

Run Code Online (Sandbox Code Playgroud)


此外,虽然我在过去5年没有触摸过Windows,但ioctl(2)应该可以帮助您获得当前的控制台大小.

  • 请加回#include,因为这不是完整答案。参见:/sf/ask/71607021/ (2认同)

Kil*_*Kid 6

为 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;
Run Code Online (Sandbox Code Playgroud)


Pro*_*ysX 5

这是一个适用于 Windows 和 Linux 的解决方案:

#if defined(_WIN32)
#define WIN32_LEAN_AND_MEAN
#define VC_EXTRALEAN
#include <Windows.h>
#elif defined(__linux__)
#include <sys/ioctl.h>
#endif // Windows/Linux

void get_terminal_size(int& width, int& height) {
#if defined(_WIN32)
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    width = (int)(csbi.srWindow.Right-csbi.srWindow.Left+1);
    height = (int)(csbi.srWindow.Bottom-csbi.srWindow.Top+1);
#elif defined(__linux__)
    struct winsize w;
    ioctl(fileno(stdout), TIOCGWINSZ, &w);
    width = (int)(w.ws_col);
    height = (int)(w.ws_row);
#endif // Windows/Linux
}

#include <iostream>
using namespace std;
int main() {
    int width=0, height=0;
    get_terminal_size(width, height);
    cout << "width=" << width << ", height=" << height << endl;
    cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @Eric Sebasta 当然,Linux C++ 中有 &lt;iostream&gt; 标准库。对于“get_terminal_size(...)”调用,您不需要它,它只是为了演示它的使用并在控制台中打印结果。你使用什么编译器?尝试使用 g++ 进行编译。`int&amp;` 是引用传递,这是 C++ 中的标准。如果由于某种原因这对您不起作用,请尝试使用指针: `get_terminal_size(int* width, int* height)` 并将每个 `width = ` 和 `height = ` 替换为 `*width = ` 和 `*height = `。 (3认同)