如何在cout上使用isatty(),还是可以假设cout ==文件描述符1?

dav*_*vka 6 c++ linux iostream

好吧,主题基本上都说明了这一切.

我有一个命令行实用程序,可以使用管道或i/o重定向以交互方式或脚本方式使用.我正在使用cincouti/o,如果输出是控制台,我想在最后写一个额外的EOL,以便用户提示将从下一行开始.在脚本中,这将是有害的.

我可以假设cin == 0, cout == 1吗?我知道没有干净的方法来获取流的文件描述符.或者是吗?

Dan*_*Dan 17

如果使用Linux(可能还有其他unix,但绝对不是Windows),你可以试试isatty.

没有直接从C++流中提取文件描述符的方法.但是,因为在C++程序中既可以同时stdout存在又可以工作(默认情况下C++提供stdio和iostream方法之间的同步),我认为你最好的选择是做一个isatty(fileno(stdout)).

确保你#include <unistd.h>.

  • 您可以在Windows上使用[`_isatty`](http://msdn.microsoft.com/en-gb/library/f4s0ddew) (2认同)

APr*_*mer 6

可以使用rdbuf()在程序中更改std :: cin和std :: cout的目标.如果你不这样做,可能很安全地假设cin = 0,cout = 1和clog和cerr都= 2,因为C++标准声明它们与C stdin,stdout和stderr同步并且那些已经在启动时POSIX那些文件描述符.