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

时间:2011-03-01 15:40:01

标签: c++ linux iostream

嗯,这个主题基本上都是这样说的。

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

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

2 个答案:

答案 0 :(得分:16)

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

没有直接从C ++流中提取文件描述符的方法。但是,因为在C ++程序中,cout和stdout都存在并且同时工作(默认情况下C ++提供stdio和iostream方法之间的同步),我认为你最好的选择是{{1 }}

确保isatty(fileno(stdout))

答案 1 :(得分:6)

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