备用控制台输出流

时间:2014-07-28 08:20:36

标签: c++ iostream io-redirection stdio

在C / C ++中,标准输出流:stdout / stderrstd::cout / std::cerr打印到控制台(更不用说clog,{ {1}} ...)。这些可以从命令行独立重定向。

有没有办法添加替代输出流:

  1. 像标准流一样打印到控制台;
  2. 不会使用任何标准流重定向。
  3. 特别是,我感兴趣的是有一些控制台输出没有通过重定向记录。

    如果没有标准方法,那么平台相关方式(Linux和Windows)也会有所帮助。

2 个答案:

答案 0 :(得分:2)

在Linux系统上,您可以打开/dev/tty并写入。见tty(4)。另请阅读console(4)并考虑/dev/console(但我建议/dev/tty

AFAIK,C ++标准没有定义这样的输出流。

另请参阅(在Posix上)syslog(3)这将是我的偏好(因为如果你没有控制终端,/dev/tty将无效)。

答案 1 :(得分:1)

对@BasileStarynkevitch建议进行跟进,可以在Windows上用"dev/tty"替换"con"

为了完整性,这是一个演示不可重定向呼叫的完整程序:

#include <stdio.h>
#include <iostream>
#include <fstream>


#ifndef DEVTTY
#define DEVTTY "con"    // on Windows
// #define DEVTTY "/dev/tty" // on Linux/MacOS
#endif

using namespace std;

int main()
{
   cout << "DEVTTY = " << DEVTTY << endl;
   printf("Print[f]ed to stdout.\n");
   fprintf(stdout, "Print[f]ed to stdout.\n");
   cout << "Printed to std::cout" << endl;

   fprintf(stderr, "Print[f]ed to stderr.\n");
   cerr << "Printed to std::cerr" << endl;

   {
      // C, stdio version
      FILE* fd = fopen(DEVTTY, "w");
      fprintf(fd, "Printed to \"%s\"\n", DEVTTY); // will not be redirected
      fclose(fd);
   }

   {
      // C++, fstream version
      std::ofstream ofs(DEVTTY);
      ofs << "Printed via std::ofstream to \"" << DEVTTY << "\"" << endl; // will not be redirected
   }

   return EXIT_SUCCESS;
}

stdout中重定向stderrStreamRedirection.exe > out.txt 2>&1给出:

out.txt

DEVTTY = con
Print[f]ed to stdout.
Print[f]ed to stdout.
Printed to std::cout
Print[f]ed to stderr.
Printed to std::cerr

并在控制台(在Windows上):

Printed to "con"
Printed via std::ofstream to "con"