如何将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
相关产品推荐
相关产品推荐

