如何在使用freopen后写入stdout

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

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

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

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

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

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

 FILE *ofp; 

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

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

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

让自己以后能够恢复stdout

 stdout = savestdout; /* WRONG */ 

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

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

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

你可以这样做:

 #include  ofstream out("out.txt"); out<<"something"; then cout<<"something";