You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将freopen重定向后的stdin、stdout恢复为默认状态?

恢复标准输入输出的实现方案

核心思路

使用对应平台的终端设备路径重新绑定stdin/stdout,或提前保存原始文件描述符后恢复。

分平台实现

类Unix系统(Linux、macOS、BSD等)

可以直接读写终端特殊文件/dev/tty恢复,更稳妥的方案是重定向前先保存原始文件描述符:

#include <stdio.h>
#include <unistd.h>

int main() {
    // 重定向前保存原始文件描述符
    int origin_stdin = dup(STDIN_FILENO);
    int origin_stdout = dup(STDOUT_FILENO);

    // 执行重定向逻辑
    freopen("file1.txt", "r", stdin);
    freopen("file2.txt", "w", stdout);

    // 此处执行需要文件读写的业务代码
    // ...

    // 方案1:通过终端文件直接恢复
    freopen("/dev/tty", "r", stdin);
    freopen("/dev/tty", "w", stdout);

    // 方案2:通过预先保存的文件描述符恢复(更稳妥,不依赖终端路径)
    // dup2(origin_stdin, STDIN_FILENO);
    // dup2(origin_stdout, STDOUT_FILENO);
    // close(origin_stdin);
    // close(origin_stdout);

    // 后续输入输出已经恢复为终端交互
    return 0;
}

Windows系统

Windows下对应控制台的特殊文件名为CON,直接用该路径重新绑定即可:

#include <stdio.h>

int main() {
    // 执行重定向逻辑
    freopen("file1.txt", "r", stdin);
    freopen("file2.txt", "w", stdout);

    // 此处执行需要文件读写的业务代码
    // ...

    // 恢复为控制台输入输出
    freopen("CON", "r", stdin);
    freopen("CON", "w", stdout);

    return 0;
}

跨平台兼容方案

通过预处理指令区分不同平台的终端设备路径,实现一套代码兼容多系统:

#include <stdio.h>

#ifdef _WIN32
#define TERMINAL_PATH "CON"
#else
#define TERMINAL_PATH "/dev/tty"
#endif

void restore_stdio() {
    freopen(TERMINAL_PATH, "r", stdin);
    freopen(TERMINAL_PATH, "w", stdout);
}

内容的提问来源于stack exchange,提问作者user15161503

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:15:03