2009年10月30日 星期五

輸出重導

 
freopen 同時通用於 C 與 C++,進行 I/O stream 重導。
例如:
freopen ("in.txt", "r", stdin); freopen ("out.txt", "w", stdout); freopen ("err.txt", "w", stderr); ..... // reset: freopen ("CON", "r", stdin); //DOS freopen ("/dev/console", "r", stdin); //Linux
將 stdio 導入檔案,再導回螢幕,可製作出如 gotoxy() 般,
游標上下左右移的效果。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

struct Redirect
{
    FILE* f;
   ~Redirect() {fclose (stdout);}
    Redirect (char* path) {
        f = freopen (path, "w", stdout);
        if (!f) {
            puts ("redirect fail!"); 
            exit(~0);
        }
    }
} Redirect ("out.txt");

int main ()
{
    cout << "Hello, World!";
    puts ("\n redirection OK!");
    return system ("pause");
}
輸出至 out.txt 的內容:
freopen ("in.txt", "r", stdin); 請按任意鍵繼續 . . . Hello, World! redirection OK!

system (..) 會亂序,因為呼叫它會喚起 cmd 程序,
造成 main 與 cmd 兩個 thread 各自獨立輸出,
輸出結果則和 OS scheduling 有關。

沒有留言:

張貼留言