之后freopen-ing stdout,我怎样才能打印终端?
freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
Run Code Online (Sandbox Code Playgroud)
我相信这就是你要找的东西:
一旦我使用了freopen,我怎么能得到原来的stdout(或stdin)?
没有便携式解决方案.但该链接还解释了使用您自己的流和可在大多数posix系统上运行的非便携式解决方案的可能解决方案.
没有好办法.如果您需要切换回来,最好的解决方案是不要首先使用freopen.尝试使用您自己的显式输出(或输入)流变量,您可以随意重新分配,同时保持原始标准输出(或标准输入)不受干扰.例如,声明一个全局
Run Code Online (Sandbox Code Playgroud)FILE *ofp;并用fprintf(ofp,...)替换对printf(...)的所有调用.(显然,你也必须检查对putchar和puts的调用.)然后你可以将ofp设置为stdout或其他任何东西.
您可能想知道是否可以完全跳过freopen,并执行类似的操作
Run Code Online (Sandbox Code Playgroud)FILE *savestdout = stdout; stdout = fopen(file, "w"); /* WRONG */通过这样做,让自己能够恢复stdout
Run Code Online (Sandbox Code Playgroud)stdout = savestdout; /* WRONG */但是像这样的代码不太可能工作,因为stdout(和stdin和stderr)通常是不能重新分配的常量(这就是为什么freopen首先存在的原因).
以不可移植的方式,可以在调用freopen以在其位置打开某个文件之前保存关于流的信息,以便稍后可以恢复原始流.最直接和最可靠的方法是使用特定于系统的调用(如dup或dup2)操作底层文件描述符(如果可用).另一种方法是复制或检查FILE结构的内容,但这极不可移植且不可靠.
在某些系统下,您可能能够重新打开一个特殊的设备文件(例如现代版本的Unix下的/ dev/fd/1),它仍然附加到(例如)原始标准输出.在某些系统下,您可以明确地重新打开控制终端,但这不一定是您想要的,因为原始输入或输出(即在您调用freopen之前stdin或stdout之前的内容)可能已被重定向命令行.
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |