web-dev-qa-db-ja.com

端末ウィンドウのサイズを取得します(行/列)

現在の出力ターミナルウィンドウの列/行の数を取得する信頼できる方法はありますか?

これらの数値をC/C++プログラムで取得したい。

私は主にGNU/Linuxソリューションを探していますが、Windowsソリューションも必要です。

21
Vittorio Romeo

Unix(ベース)の場合、 ioctl(2) およびTIOCGWINSZを使用します:

_
#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. */

// ...

_

また、私は過去5年間Windowsに触れていませんが、コンソールウィンドウのサイズを取得するには GetConsoleScreenBufferInfo() が役立つはずです。

22
Moshe Gottlieb

Windowsでは、次のコードを使用して、コンソールウィンドウのサイズを出力します( here から借用):

#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;
}

Linuxでは、代わりに以下を使用します( here から借用):

#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
}
36
herohuyongtao

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;
3
Killzone Kid

Libtermcapを使用するGNU/Linuxの場合( https://www.gnu.org/software/termutils/manual/termcap-1.3/html_mono/termcap.html )create demo.c:

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <term.h>

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 <yourtype>'.\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のドキュメントから直接コピーされます。)

1
Andrew