我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
在Unix/Linux控制台编程,为了能输出好看一些,需要知道窗口宽度,当然使用支持很宽的窗口的终端也是个办法,但是实在没有很宽的终端怎么办呢,还是要从程序上想办法的。
判断控制台窗口宽度需要两个函数:
- isatty 判断一个文件描述符是不是控制台终端
- ioctl 参数TIOCGWINSZ用于获取控制台尺寸
isatty用法很简单,传入参数STDIN_FILENO,表示标准输入,返回0表示非tty。一般就判断标准输入就行了,当然如果考虑输入输出重定向,应该判断标准输出才对。
ioctl复杂一点,第一个参数是文件指针,第二个参数是TIOCGWINSZ,第三个参数是用来接收结果的winsize指针。
winsize结构如下:
struct winsize
{
unsigned short int ws_row;
unsigned short int ws_col;
unsigned short int ws_xpixel;
unsigned short int ws_ypixel;
};
ws_row是行,ws_col是列。
整个代码如下:
if (0 == isatty(STDIN_FILENO))
{
cout << "not tty" << endl;
}
else
{
winsize sz;
if (ioctl(STDIN_FILENO, TIOCGWINSZ, (char *)&sz) < 0)
{
cout << "get tty size error" << endl;
}
else
{
cout << "控制台窗口尺寸 ws_row=" << sz.ws_row << " ws_col=" << sz.ws_col << endl;
}
}
if (sizeof(long) != 8)
{
cout << "非64位程序!" << endl;
return 1;
}
这是我惯用的程序启动流程,顺手判断了是不是64位程序,要是谁改了编译参数,不是64位我就拒绝执行了。
以上程序是在Unix/Linux下运行的,windows上不一定行,也没必要,毕竟windows上的程序不会以控制台为核心的。
(这里是结束)