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

那么,这个问题基本上是这么说的。

我有一个命令行实用程序,可以使用pipe道或I / Oredirect交互或脚本使用。 我正在使用cincout进行I / O操作,并且如果输出是控制台,我想在末尾编写一个额外的EOL,以便用户提示符将从下一行开始。 在脚本中这将是有害的。

我可以假设cin == 0, cout == 1吗? 我知道没有干净的方式来获取stream的文件描述符。 还是呢?

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

如果使用Linux(也可能是其他Unix,但绝对不是Windows),你可以尝试isatty 。

没有直接的方式从C ++流中提取文件描述符。 然而,因为在一个C ++程序中,cout和stdout存在并且同时工作(C ++默认提供了stdio和iostream方法之间的同步),所以我认为最好的办法是做一个isatty(fileno(stdout))

确保你#include <unistd.h>