**自:
本篇將介紹輸入輸出的重定向問題,先來看乙個小小的例項,設有乙個程式,該程式的輸入輸出為標準輸入輸出即從鍵盤上輸入,輸出到螢幕。現在要重定向輸入法輸出,使程式從檔案中讀取資料,處理後輸出到檔案。程式**如下(稱此程式為示例程式):
[cpp]view plain
copy
#include
intmain()
} 試給出幾種不同的實現方法,另外如果沒有程式**,只有可執行檔案,又應該如何做了?
函式功能:重定向控制台的輸入輸出
函式原型:
file *
freopen
(char
path
,char
mode
,file *stream
);函式說明:
第乙個引數為檔案指標(也可以用來指向標準輸入輸出)。
第二個引數為開啟方式,
"w"表示寫,
"r"表示讀,
"a"表示追加。其它設定可以參考
msdn
。第三個引數為
file型別的指標,傳入stdin
表示標準輸入,傳入stdout
表示標準輸出。
這樣用只要用簡單一句freopen
("infile.txt"
"r"stdin
);就可以使程式中的
scanf()
函式從檔案中讀取資料作為輸入,同樣
freopen
("outfile.txt"
"w"stdout
);可以使程式中的
printf()
函式將輸出由標準輸出改成輸出到檔案。現在有個問題,將程式的輸入輸出重定向到檔案後,還能改回到標準輸入輸出嗎?答案是可以的,對第乙個引數傳入
"con"這個字串就可以了(linux為"/dev/console")。
下面就給出修改後的**:
[cpp]view plain
copy
//直接使用freopen()函式 來改變控制台的標準輸入輸出
#include
intmain()
fclose(pfileread);
fclose(pfilewrite);
//回到到控制台的標準輸入輸出 windows為"con" linux為"/dev/console"
freopen("con"
, "r"
, stdin);
freopen("con"
, "w"
, stdout);
printf("finish 輸入0表示結束:\n"
);
dowhile
(n != 0);
return
0;
} 執行結果如下圖所示:
可以看出該程式的輸出輸入已經完成了重定向。
有些場合使用類來完成輸入輸出的重定向任務會更加方便和習慣一些。所幸c++中就有ifstream
和ofstream
這二個類來幫助我們完成這一任務。這個二類的詳細功能就不細說了。下面介紹下如何使用這二個類來重定向程式的輸入輸出(看的時候看慢點喔,不會會被很多類名給搞暈去^_^)。
這二個類可以以讀的方式和寫的方法開啟乙個檔案(ifstream
的首字母i就表示in,而ofstream
的首字母o就表示out),在iosfwd檔案中找到:
basic_ifstream
<
char
char_traits
<
char
ifstream
;basic_ofstream
<
char
char_traits
<
char
ofstream
;然後可以在
fstream
檔案中找到
basic_ifstream
類是繼承於basic_istream
類,basic_ofstream
類是繼承於basic_ostream
類。然後再來看看c++中大家平常使用的cin和cout,可以在iostream檔案中找到cin和cout的定義,這二個實際是istream
型別和ostream
型別的變數:
_crtimp
cin;
_crtimp
cout
;然後在
iosfwd
檔案中可以找到:
basic_istream
<
char
char_traits
<
char
istream
;basic_ostream
<
char
char_traits
<
char
ostream;明顯
cin和
cout
與ifstream
類和ofstream
類有著非常密切關係——cin
是basic_istream
類的變數,而ifstream
則是basic_istream
類的派生類。cout
是basic_ostream
類的變數,而ofstream
則是basic_ostream
類的派生類。
有了這個後,猜測很可能會有某個成員函式能將它們聯絡到一起,從而讓cin和cout由標準輸入輸出重定向到從檔案中讀取,輸出到檔案。事實上在
basic_istream類實際是虛繼承於basic_ioso類,basic_ostream類實際是虛繼承於basic_ios類。這二個類都有個rdbuf
()成員函式,這個函式允許我們訪問和修改類中乙個型別為basic_streambuf類的成員變數。改動這個變數就能重定向輸入輸出。因此對cin和cout呼叫這個rdbuf
()函式並傳入ifstream和ofstream的rdbuf
()就可以將控制台的標準輸入輸出改成從檔案中讀取和輸出到檔案。
ok,方法既然找到了,那下面就使用c++的方法來重定向輸入輸出:
[cpp]view plain
copy
//使用ifstream和ofstream及cin和cout的rdbuf()
#include
#include
using
namespace
std;
intmain()
infile.close();
outfile.close();
//回到控制台的標準輸入輸出
cin.rdbuf(strmin_buf);
cout.rdbuf(strmout_buf);
cout<
<
dowhile
(n != 0);
return
0;
} 執行結果如下圖所示:
同樣,這個程式也完成了輸入輸出的重定向。
程序間通訊(二) 管道
管道分為命名管道和匿名管道,首先我們談一下命名管道。命名管道雙向,跨網路,任何程序都可以輕易的抓住,放進管道的資料有固定的格 式,而使用readfile 只能讀取該大小的倍數。其實管道的使用方法與檔案類似,都能使用read,write,open等普通io函式.管道描述符來類似於檔案描述符.事實上,管...
程序間通訊 之 管道
一 無名管道 特點 具有親緣關係的程序間通訊,但不僅僅指父子程序之間哦。1 無名管道的建立 int pipe int pipefd 引數 pipefd 陣列的首位址 返回值 成功返回0,失敗返回 1 注意 無名管道存在核心空間,建立成功會給使用者空間兩個檔案描述符,fd 0 讀管道 fd 1 寫管道...
程序間通訊之管道
我們將乙個程序到另乙個程序的資料流稱為管道,它是程序間通訊最古老的方式。管道分為兩種 匿名管道與命名管道。匿名管道 顧名思義,所謂的匿名管道自然就是沒有名字的管道,這種管道通常用於有親緣關係的程序間的通訊。匿名管道通常由pipe函式來建立,當乙個程序建立了乙個匿名管道後,它們的模型就是這樣的 可以看...