programing

터미널 창의 크기 가져오기(행/열)

powerit 2023. 6. 17. 09:45
반응형

터미널 창의 크기 가져오기(행/열)

현재 출력 단자 창의 열/행 수를 가져오는 신뢰할 수 있는 방법이 있습니까?

저는 이 숫자들을 C/C++ 프로그램에서 검색하고 싶습니다.

저는 주로 GNU/리눅스 솔루션을 찾고 있지만 Windows 솔루션도 필요합니다.

Windows에서 다음 코드를 사용하여 콘솔 창의 크기를 인쇄합니다(여기서 Quantum의 답변참조).

#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의 경우 다음을 대신 사용합니다(여기에 있는 John T답변에서 차용).

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

유닉스(기반)의 경우 및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(윈도우)를 터치하지 않았지만 콘솔 창 크기를 확인하는 데 도움이 될 것입니다.

다음은 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;
}

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;

libtermap(https://www.gnu.org/software/termutils/manual/termcap-1.3/html_mono/termcap.html) 을 사용하는 GNU/리눅스에서 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

이것이 윈도우에서 많은 도움이 될지는 모르겠지만, 그 플랫폼은 잘 모릅니다.

(이 코드 중 일부는 termcap 설명서에서 직접 복사한 것입니다.)

많은 슬픔 끝에:

  auto const w(WEXITSTATUS(std::system("exit `tput cols`")));
  auto const h(WEXITSTATUS(std::system("exit `tput lines`")));

언급URL : https://stackoverflow.com/questions/23369503/get-size-of-terminal-window-rows-columns

반응형