freopen
之后stdout
,如何在终端上打印?
freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
答案 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";