使用freopen后如何在stdout中写入

时间:2014-11-02 12:57:07

标签: c++ c freopen

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

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

2 个答案:

答案 0 :(得分:7)

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

Once I've used freopen, how can I get the original stdout (or stdin) back?

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

  

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

FILE *ofp;
     

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

     

你可能想知道你是否可以完全跳过freopen并做一些事情   像

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

让自己以后可以通过

恢复标准输出
stdout = savestdout;      /* WRONG */
     

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

     

有可能以不可移植的方式保存信息   关于一个流,然后调用freopen来打开一个文件,   这样以后可以恢复原始流。最多   简单可靠的方法是操纵底层文件   描述符使用特定于系统的调用,如dup或dup2,if   可用。另一种方法是复制或检查文件的内容   结构,但这是非常不可移植和不可靠的。

     

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

答案 1 :(得分:-4)

您可以通过以下方式完成:

#include <fstream> 

ofstream out("out.txt");

out<<"something";

then

cout<<"something";