在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";
以上就是c/c++开发分享如何在使用freopen后写入stdout相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559871.html