2014-04-29 15 views
12

Czy istnieje jakiś niezawodny sposób uzyskania liczby kolumn/wierszy bieżącego okna terminala wyjściowego?Uzyskaj rozmiar okna terminala (wiersze/kolumny)

Chcę pobrać te liczby w programie C/C++.

Poszukuję przede wszystkim rozwiązania GNU/Linux, ale potrzebuję również rozwiązania Windows.

+0

W systemie Linux, można także spróbować 'stty size' – choroba

+0

[W] (http://stackoverflow.com/questions/18783988/how-to-get- windows-size-from-linux) może pomóc. – devnull

+0

Możliwy duplikat [Uzyskiwanie szerokości terminala w C?] (Https://stackoverflow.com/questions/1022957/getting-termin-width-in-c) –

Odpowiedz

12

Linux/Unix: Użyj ioctl ze standardowym plikiem wyjściowym o numerach STDOUT_FILENO i TIOCGWINSZ.

struct winsize size; 
ioctl(STDOUT_FILENO,TIOCGWINSZ,&size); 
/* size.ws_row is the number of rows, size.ws_col is the number of columns. */ 


Ponadto, podczas gdy ja nie dotykać okien w ciągu ostatnich 5 lat, GetConsoleScreenBufferInfo powinien pomóc uzyskać aktualny rozmiar konsoli.

+0

Czytałem, że to nie jest standardowy POSIX - czy są jakieś definicje to może mi powiedzieć, czy kod będzie działał na bieżącej maszynie? –

+0

Proszę z powrotem dodać '# include's, ponieważ nie jest to pełna odpowiedź. Zobacz: https://stackoverflow.com/questions/1022957/getting-terminal-width-in-c –

1

na GNU/Linux przy użyciu libtermcap (https://www.gnu.org/software/termutils/manual/termcap-1.3/html_mono/termcap.html) tworzyć 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; 
} 

Następnie skompilować i uruchomić z gcc -o demo.x demo.c -ltermcap dać:

$ ./demo.x 
Got: Lines: 24, Columns: 80 

wątpię, to pomaga wiele na Windows chociaż, Nie znam tej platformy.

(Część tego kodu jest kopiowany prosto z dokumentacją termcap).

12

W systemie Windows, należy użyć następującego kodu, aby wydrukować rozmiar okna konsoli (zapożyczoną z 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; 
} 

W systemie Linux, należy użyć następującego zamiast (zapożyczone z 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 
} 
0

Aby rozwinąć odpowiedź @herohuyongtao dla Windows. Właściwość .srWindow daje odpowiedź na rozmiar okna konsoli, tj. Widoczne wiersze i cols. To nie mówi, jaka jest rzeczywista dostępna szerokość i wysokość bufora ekranu, która może być większa, jeśli okno zawiera paski przewijania. Jeśli tak jest, należy .dwSize:

CONSOLE_SCREEN_BUFFER_INFO sbInfo; 
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbInfo); 
int availableColumns = sbInfo.dwSize.X; 
int availableRows = sbInfo.dwSize.Y; 
Powiązane problemy