在C / C ++中,标准输出流:stdout
/ stderr
,std::cout
/ std::cerr
打印到控制台(更不用说clog
,{ {1}} ...)。这些可以从命令行独立重定向。
有没有办法添加替代输出流:
特别是,我感兴趣的是有一些控制台输出没有通过重定向记录。
如果没有标准方法,那么平台相关方式(Linux和Windows)也会有所帮助。
答案 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
中重定向stderr
和StreamRedirection.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"