通常可以使用freopen将输入/输出重定向到文件中。例如
[CPP]freopen(”in.txt”, “r”, stdin);
freopen(”out.txt”, “w”, stdin);
[/CPP]

但并不存在一个完全兼容的解决方案能够在以后将标准句柄恢复。在C标准库里面是没有办法的。
很容易想到的方式是重新打开标准控制台设备文件,但遗憾的是,这个设备文件的名字是操作系统相关的。

  • 在DOS/Win中,这个名字是CON,因此可以使用

    [cpp]freopen(”CON”, “r”, stdin)[/cpp]

  • 在linux中,控制台设备是 /dev/console

    [cpp]freopen(”/dev/console”, “r”, stdin)[/cpp]

另外,在类unix系统中,可以使用dup系统调用来预先复制一份原始的stdin句柄。


使用C++的流库,可以有另外一种方式达到freopen的效果,而且很容易恢复。就是使用流的rdbuf。例如:

[CPP]
ofstream outf(”out.txt”);
streambuf *strm_buf = cout.rdbuf();
cout.rdbuf(outf.rdbuf());
cout << “write something to file”;
cout.rdbuf(strm_buf); //recover
cout << “display something on screen”;
[/CPP]