使用freopen后如何在stdout中写入

cij*_*nzy 2 c c++ freopen

之后freopen-ing stdout,我怎样才能打印终端?

freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
Run Code Online (Sandbox Code Playgroud)

P.P*_*.P. 7

我相信这就是你要找的东西:

一旦我使用了freopen,我怎么能得到原来的stdout(或stdin)?

没有便携式解决方案.但该链接还解释了使用您自己的流和在大多数posix系统上运行的非便携式解决方案的可能解决方案.

没有好办法.如果您需要切换回来,最好的解决方案是不要首先使用freopen.尝试使用您自己的显式输出(或输入)流变量,您可以随意重新分配,同时保持原始标准输出(或标准输入)不受干扰.例如,声明一个全局

FILE *ofp;
Run Code Online (Sandbox Code Playgroud)

并用fprintf(ofp,...)替换对printf(...)的所有调用.(显然,你也必须检查对putchar和puts的调用.)然后你可以将ofp设置为stdout或其他任何东西.

您可能想知道是否可以完全跳过freopen,并执行类似的操作

FILE *savestdout = stdout;
stdout = fopen(file, "w");    /* WRONG */
Run Code Online (Sandbox Code Playgroud)

通过这样做,让自己能够恢复stdout

stdout = savestdout;      /* WRONG */
Run Code Online (Sandbox Code Playgroud)

但是像这样的代码不太可能工作,因为stdout(和stdin和stderr)通常是不能重新分配的常量(这就是为什么freopen首先存在的原因).

以不可移植的方式,可以在调用freopen以在其位置打开某个文件之前保存关于流的信息,以便稍后可以恢复原始流.最直接和最可靠的方法是使用特定于系统的调用(如dup或dup2)操作底层文件描述符(如果可用).另一种方法是复制或检查FILE结构的内容,但这极不可移植且不可靠.

在某些系统下,您可能能够重新打开一个特殊的设备文件(例如现代版本的Unix下的/ dev/fd/1),它仍然附加到(例如)原始标准输出.在某些系统下,您可以明确地重新打开控制终端,但这不一定是您想要的,因为原始输入或输出(即在您调用freopen之前stdin或stdout之前的内容)可能已被重定向命令行.