有没有可靠的方法来获取当前输出终端窗口的列数/行数?
我想在C / C ++程序中检索这些数字。
我主要是在寻找GNU / Linux解决方案,但也需要Windows解决方案。
答案 0 :(得分:23)
在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
}
答案 1 :(得分:16)
Linux / UNIX中:
将ioctl
与标准输出文件编号STDOUT_FILENO
和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. */
此外,虽然我在过去5年没有触摸过Windows,GetConsoleScreenBufferInfo
应该可以帮助您获得当前的控制台大小。
答案 2 :(得分:2)
展开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 :(得分:1)
在使用libtermcap(https://www.gnu.org/software/termutils/manual/termcap-1.3/html_mono/termcap.html)的GNU / Linux上创建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文档中复制。)
答案 4 :(得分:0)
这是在Windows和Linux上均可使用的解决方案:
return StreamProvider<List<ReceiverModel>>.value(
initialData: List(),
value: ReceiverDatabaseService().receivers,
答案 5 :(得分:0)
多难过:
auto const w(WEXITSTATUS(std::system("exit `tput cols`")));
auto const h(WEXITSTATUS(std::system("exit `tput lines`")));