2

freopen-ing之后stdout,如何在终端上打印?

freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
4

2 回答 2

8

我相信这就是您正在寻找的:

使用 freopen 后,如何取回原始标准输出(或标准输入)?

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

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

FILE *ofp;

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

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

FILE *savestdout = stdout;
stdout = fopen(file, "w");    /* WRONG */

让自己以后可以通过执行来恢复标准输出

stdout = savestdout;      /* WRONG */

但是这样的代码不太可能工作,因为标准输出(以及标准输入和标准错误)通常是不能重新分配的常量(这就是为什么 freopen 首先存在的原因)。

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

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

于 2014-11-02T13:19:45.470 回答
-4

你可以这样做:

#include <fstream> 

ofstream out("out.txt");

out<<"something";

then

cout<<"something";
于 2014-11-02T13:16:47.463 回答