freopen()重定向的開啟和關閉

2022-05-02 11:00:09 字數 2013 閱讀 3908

使用不同的檔案或模式重新開啟流,即重定向。

實現重定向,把預定義的標準流檔案定向到由path指定的檔案中。(直觀感覺/實際操作都像是把檔案定向到流,難道是說,對流來說就是重定向,大霧)。

如果指定了新

檔名,則該函式首先嘗試關閉已與stream(第三個引數)關聯的任何檔案並取消關聯。然後,無論該流是否成功關閉,freopen都會開啟由filename指定的檔案,並將其與流關聯,就像fopen使用指定的模式一樣。(先記住後面有用)

檔名即要開啟的檔案的名字。

其值應遵循執行環境的檔名規範,並且可以包含路徑(如果系統支援)。

模式

使用上面的

模式說明符,檔案將作為文字檔案開啟。為了開啟乙個檔案作為二進位制檔案中,「b」的字元必須被包括在模式串。這個附加的「b」字元可以附加在字串的末尾(從而產生以下復合模式:「rb」,「wb」,「ab」,「r + b」,「w + b」,「a + b「)或插入字母和混合模式的」+「符號之間(」rb +「,」wb +「,」ab +「)。

流這裡主要用標準流檔案,標準流檔案具體是指stdin、stdout和stderr。其中stdin是標準輸入流,預設為鍵盤;stdout是標準輸出流,預設為螢幕;stderr是標準錯誤流,一般把螢幕設為預設。通過呼叫freopen,就可以修改標準流檔案的預設值,實現重定向。

這個方法的好處十分明顯,freopen之後,就能像平常一樣使用scanf,printf,cin,cout

清單一:c++版

1 #include2

using

namespace

std;34

intmain()

5

清單二:c版

1 #include2

using

namespace

std;34

intmain()

5

清單三:帶路徑的輸入輸出檔案

我用的vs2017,預設在工程資料夾下,只要路徑寫對,可以在任意資料夾下(本人測試只能放在該工程資料夾下的任意資料夾)

1 #include2

using

namespace

std;34

intmain()

5

清單四:競賽常用版

比如,杭電1000題我完全可以這樣提交:

#include #include 

using

namespace

std;

intmain()

在本地機器除錯時,因為沒有定義過online_judge,所以會執行freopen("in.txt","r",stdin);方便本機上的除錯,當提交到oj上後,因為有了online_judge的定義,所以跳過語句freopen("in.txt","r",stdin); 從 int a,b;處開始執行。

在寫**時常出現這種情況:我們從原有檔案使用freopen匯入資料,但之後關閉檔案再次從鍵盤輸入。我們如果直接fclose(stdin),之後的鍵盤輸入肯定不管用。應如何解決?

顯然,如果在使用完freopen之後,如果還需要使用標準輸入輸出,不能把它們直接fclose。

我們不妨再次重定向,把stdin、stdout重定向到控制台,就能從鍵盤接受輸入、從螢幕輸出。

1 #include2

using

namespace

std;34

intmain()

5

需要注意,這裡其實沒有真正關閉,只是再次重定向,回到控制台。

在windows/dos,讀檔案後用freopen("con", "r", stdin),寫檔案後  freopen("con", "w", stdout)。

在linux中,控制台裝置是 /dev/console:freopen("/dev/console", "r", stdin)。

1、2、

3、4、

5、

利用fprintf和freopen重定向資訊列印

fprintf方法原型 int fprintf file const char file 為資訊輸出的檔案流指標,如stdout,stderr test.exe 1 out.log 2 err.log stdout重定向到out.log中,stderr重定向到err.log中 test.exe ou...

檔案讀寫重定向freopen函式

函式原型 file freopen const char filename,const char mode,file file 其中file 是檔案指標,參考 c檔案 mode是操作型別,最常用的就是 r 和 w 表示讀寫。file是需要重定向到的檔案指標 示例 include include us...

使用freopen函式重定向輸入流

有那麼一陣子,除錯程式的時候經常遇到大量輸入資料的情況,如果從控制台輸入,將是非常耗時且容易出錯,幸好有freopen函式,可以將輸入重定向到檔案中。也就是說,將輸入資料放到檔案中,呼叫freopen函式將輸入流從控制台重定向為檔案,那麼後續從控制台讀取輸入資料的操作,將自動變為從檔案中讀取,不需要...