freopen 的使用


使用的調試環境爲gdb, 編譯器爲gcc,g++。(服務器就是用的這個)
每當做ACM題目的時候都是寫好程序然後運行,輸入題目中所給的測試數據,但是調試往往不
是一次兩次就能解決問題的。一般的題目還行。遇到像 Web Navigator 這樣的有大量的輸入的題目
就頭痛了。而freopen函數就提供了一種非常簡單的解決方法。

函數名:freopen
聲明:FILE *freopen( const char *path, const char *mode, FILE *stream );
所在文件: stdio.h
參數說明:
path: 文件名。
mode: 文件打開的模式。和fopen中的模式(如r, w,)相同。
stream: 一個文件,通常使用標準流文件(stdin, stdout, stderr)。

返回值:成功,則返回一個path所指定的文件的指針。失敗,返回NULL。(一般都不使用它的返回值)


功能:簡單說,就是實現重定向。把預定義的幾個標準流文件(stdin, stdout, stderr)定向到由path指定的文件中。
如下例:
int main()
{
//        freopen("debug\\in.txt","r",stdin);
        while(cin>>ans)
        {
                          //to do .......
        }
        cout<<endl;
        return 0;
}
freopen("debug\\in.txt","r",stdin)的作用就是把stdin重定向到debug\\in.txt文件中,這樣在用cin或是
用scanf輸入時便不會從標準輸入流提取數據。而是從in.txt文件中獲取輸入。只要把輸入事先粘貼到
in.txt,調試時就方便多了。
                                                          ------------------------by 王海斌


但並不存在一個完全兼容的解決方案能夠在以後將標準句柄恢復。在C標準庫裏面是沒有辦法的。


Addition:

我用的是Red Flag Linux5.0
用 freopen("/dev/console", "r", stdin); 無法恢復
將"/dev/console"改爲"/dev/tty"成功了

進行如下操作:

[code@tzq ~]$ echo "hello" > /dev/tty
hello
[code@tzq ~]$ echo "hello" > /dev/console
bash: /dev/console: 權限不夠
[code@tzq ~]$

不知道是不是不是root,權限不夠的原因。
很容易想到的方式是重新打開標準控制檯設備文件,但遺憾的是,這個設備文件的名字是操作系統相關的。

    * 在DOS/Win中,這個名字是CON,因此可以使用
      PLAIN TEXT
      C++:
         1.
            freopen("CON", "r", stdin)

    * 在linux中,控制檯設備是 /dev/console
      PLAIN TEXT
      C++:
         1.
            freopen("/dev/console", "r", stdin)

另外,在類unix系統中,可以使用dup系統調用來預先複製一份原始的stdin句柄。


                                                       ---------------------------by skywind

轉載:http://hi.baidu.com/joopoo/blog/item/47906b6617c0ff27aa184c2c.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章