HTTP 狀態(tài)消息
628
2022-05-29
本篇將介紹輸入輸出的重定向問題,先來看一個(gè)小小的實(shí)例,設(shè)有一個(gè)程序,該程序的輸入輸出為標(biāo)準(zhǔn)輸入輸出即從鍵盤上輸入,輸出到屏幕。現(xiàn)在要重定向輸入法輸出,使程序從文件中讀取數(shù)據(jù),處理后輸出到文件。程序代碼如下(稱此程序?yàn)槭纠绦颍?/p>
試給出幾種不同的實(shí)現(xiàn)方法,另外如果沒有程序代碼,只有可執(zhí)行文件,又應(yīng)該如何做了?
實(shí)現(xiàn)方法一使用C語言的freopen()函數(shù)
函數(shù)功能:重定向控制臺(tái)的輸入輸出
函數(shù)原型:
函數(shù)說明:
第一個(gè)參數(shù)為文件指針(也可以用來指向標(biāo)準(zhǔn)輸入輸出)。
第二個(gè)參數(shù)為打開方式,"w"表示寫,"r"表示讀,"a"表示追加。其它設(shè)置可以參考MSDN。
第三個(gè)參數(shù)為FILE類型的指針,傳入stdin表示標(biāo)準(zhǔn)輸入,傳入stdout表示標(biāo)準(zhǔn)輸出。
這樣用只要用簡(jiǎn)單一句freopen("infile.txt", "r", stdin);就可以使程序中的scanf()函數(shù)從文件中讀取數(shù)據(jù)作為輸入,同樣freopen("outfile.txt", "w", stdout);可以使程序中的printf()函數(shù)將輸出由標(biāo)準(zhǔn)輸出改成輸出到文件。現(xiàn)在有個(gè)問題,將程序的輸入輸出重定向到文件后,還能改回到標(biāo)準(zhǔn)輸入輸出嗎?答案是可以的,對(duì)第一個(gè)參數(shù)傳入"CON"這個(gè)字符串就可以了(linux為"/dev/console")。
下面就給出修改后的代碼:
} 運(yùn)行結(jié)果如下圖所示:
可以看出該程序的輸出輸入已經(jīng)完成了重定向。
實(shí)現(xiàn)方法2 使用C++的ifstream和ofstream類
有些場(chǎng)合使用類來完成輸入輸出的重定向任務(wù)會(huì)更加方便和習(xí)慣一些。所幸C++中就有ifstream和ofstream這二個(gè)類來幫助我們完成這一任務(wù)。這個(gè)二類的詳細(xì)功能就不細(xì)說了。下面介紹下如何使用這二個(gè)類來重定向程序的輸入輸出(看的時(shí)候看慢點(diǎn)喔,不會(huì)會(huì)被很多類名給搞暈去^_^)。
這二個(gè)類可以以讀的方式和寫的方法打開一個(gè)文件(ifstream的首字母i就表示in,而ofstream的首字母o就表示out),在iosfwd文件中找到:
然后可以在fstream文件中找到basic_ifstream類是繼承于basic_istream類,basic_ofstream類是繼承于basic_ostream類。
然后再來看看C++中大家平常使用的cin和cout,可以在iostream文件中找到cin和cout的定義,這二個(gè)實(shí)際是istream類型和ostream類型的變量:
然后在iosfwd文件中可以找到:
明顯cin和cout與ifstream類和ofstream類有著非常密切關(guān)系——cin是basic_istream類的變量,而ifstream則是basic_istream類的派生類。cout是basic_ostream類的變量,而ofstream則是basic_ostream類的派生類。
有了這個(gè)后,猜測(cè)很可能會(huì)有某個(gè)成員函數(shù)能將它們聯(lián)系到一起,從而讓cin和cout由標(biāo)準(zhǔn)輸入輸出重定向到從文件中讀取,輸出到文件。事實(shí)上在basic_istream類實(shí)際是虛繼承于basic_ioso類,basic_ostream類實(shí)際是虛繼承于basic_ios類。這二個(gè)類都有個(gè)rdbuf()成員函數(shù),這個(gè)函數(shù)允許我們?cè)L問和修改類中一個(gè)類型為basic_streambuf類的成員變量。改動(dòng)這個(gè)變量就能重定向輸入輸出。因此對(duì)cin和cout調(diào)用這個(gè)rdbuf()函數(shù)并傳入ifstream和ofstream的rdbuf()就可以將控制臺(tái)的標(biāo)準(zhǔn)輸入輸出改成從文件中讀取和輸出到文件。
OK,方法既然找到了,那下面就使用C++的方法來重定向輸入輸出:
} 運(yùn)行結(jié)果如下圖所示:
同樣,這個(gè)程序也完成了輸入輸出的重定向。
本文轉(zhuǎn)載自異步社區(qū)
軟件開發(fā)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。