使用freopen后如何在标准输出中写入[重复]
Posted
技术标签:
【中文标题】使用freopen后如何在标准输出中写入[重复]【英文标题】:How to write in stdout after using freopen [duplicate] 【发布时间】:2014-11-02 12:57:06 【问题描述】:freopen
-ing stdout
之后,如何在终端上打印?
freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
【问题讨论】:
代码比英文更容易理解——你应该把它贴出来。 在什么操作系统上?我相信 Windows 不一定允许这个工作...... @MatsPetersson 在 ubuntu 上 然后发布一个你正在做的小例子,并解释你的期望与实际发生的情况。 @darkdream 你想在文件中打印一些东西然后在控制台中打印一些东西吗? 【参考方案1】:我相信这就是您正在寻找的:
Once I've used freopen, how can I get the original stdout (or stdin) back?
没有便携式解决方案。但该链接还解释了使用您自己的流的可能解决方案和适用于大多数 posix 系统的non-portable 解决方案。
没有什么好办法。如果您需要切换回来,最好的解决方案 不是一开始就使用过freopen。尝试使用自己的 显式输出(或输入)流变量,您可以在 将,同时保持原始标准输出(或标准输入)不受干扰。为了 例如,声明一个全局
FILE *ofp;
并将所有对 printf( ... ) 的调用替换为 fprintf(ofp, ... )。 (显然,您还必须检查对 putchar 和 puts 的调用。) 然后您可以将 ofp 设置为 stdout 或其他任何内容。
您可能想知道是否可以完全跳过 freopen 并做一些事情 喜欢
FILE *savestdout = stdout; stdout = fopen(file, "w"); /* WRONG */
让自己以后可以通过这样做来恢复标准输出
stdout = savestdout; /* WRONG */
但是这样的代码不太可能工作,因为标准输出(和标准输入 和 stderr)通常是不能重新分配的常量(其中 这就是为什么 freopen 首先存在)。
可能以非便携方式保存信息 在调用 freopen 以在其位置打开某个文件之前关于流, 以便以后可以恢复原始流。最多 直接可靠的方法是操作底层文件 使用系统特定调用(如 dup 或 dup2)的描述符,如果 可用的。另一种是复制或检查FILE的内容 结构,但这非常不便携且不可靠。
在某些系统下,您也许可以重新打开一个特殊的设备文件 (例如现代版本的 Unix 下的 /dev/fd/1 )仍然是 附加到(例如)原始标准输出。你可以,在 一些系统,明确地重新打开控制终端,但这 不一定是您想要的,因为原始输入或输出 (即在您调用 freopen 之前的标准输入或标准输出)可以 已从命令行重定向。
【讨论】:
【参考方案2】:你可以这样做:
#include <fstream>
ofstream out("out.txt");
out<<"something";
then
cout<<"something";
【讨论】:
这不是回答问题 @SHR:让问这个问题的人说它在回答还是不回答,可能对他有用 @darkdream 欢迎你:) 如果你要写这样的答案,至少要使用stdio来与问题保持一致。否则我们可能会遇到“问:我如何在 Java 中做到这一点?”的情况。 “答:改用 C#。”以上是关于使用freopen后如何在标准输出中写入[重复]的主要内容,如果未能解决你的问题,请参考以下文章