現在の出力ターミナルウィンドウの列/行の数を取得する信頼できる方法はありますか?
これらの数値をC/C++プログラムで取得したい。
私は主にGNU/Linuxソリューションを探していますが、Windowsソリューションも必要です。
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()
が役立つはずです。
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
}
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;
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のドキュメントから直接コピーされます。)