터미널 창의 크기 가져오기(행/열)
현재 출력 단자 창의 열/행 수를 가져오는 신뢰할 수 있는 방법이 있습니까?
저는 이 숫자들을 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
'programing' 카테고리의 다른 글
32비트 또는 64비트에 따라 데이터 유형 또는 구조의 크기는 누가 결정합니까? (0) | 2023.06.17 |
---|---|
(오라클)페이지화 쿼리를 사용할 때 총 결과 수를 가져오는 방법은 무엇입니까? (0) | 2023.06.17 |
VBA의 하위 문자열 (0) | 2023.06.17 |
Vuex - 5초마다 대용량 데이터 청크 폴링 시 메모리 누수/JS 힙 크기 (0) | 2023.06.17 |
Python 스크립트의 파일 이름 및 줄 번호 (0) | 2023.06.17 |