C++ 檔案重定向
檔案的重定向就是把由鍵盤輸入,螢幕輸出轉換為輸入檔案作為輸入,把內容放入輸出檔案。就要用到檔案輸入輸出的類:
ifstream/ofstream/fstream
這些類的關係是:
fstream 讀寫操作,對開啟的檔案進行讀寫操作
ofstream 檔案寫操作,記憶體寫入儲存裝置
ifstream 檔案讀操作,儲存裝置讀到記憶體中
(只需要讀的時候用ofstream,只需要寫用ifsterm,讀寫都用fstream)
用一段程式解釋:
#include #include #include using namespace std; main() { ifstream fin("inputisbn.txt");//已有輸入檔案 ofstream fout("outisbn.txt");//已有輸出檔案 streambuf*cinbackup; streambuf*coutbackup; coutbackup=cout.rdbuf(fout.rdbuf());//用rdbuf()重定向 cinbackup=cin.rdbuf(fin.rdbuf()); cout<<"write"<>line; cout<
例1
#include <iostream>
#include<ostream>
#include<fstream>
using namespace std;
main()
{
ifstream fin("inputisbn.txt");//已有輸入檔案
ofstream fout("outisbn.txt");//已有輸出檔案
streambuf*cinbackup;
streambuf*coutbackup;
coutbackup=cout.rdbuf(fout.rdbuf());//用rdbuf()重定向
cinbackup=cin.rdbuf(fin.rdbuf());
cout<<"write"<<endl;
char line[100];
cin>>line;
cout<<line;
//restore standard streambuf
cin.rdbuf(cinbackup);//取消,恢復鍵盤輸入
cout.rdbuf(coutbackup);//取消,恢復螢幕輸出
return 0;
}
1.開啟你需要讀或者寫的檔案。
在fstream類中使用成員函式open()可以開啟需要的檔案。
public member function
void open ( const char * filename,
ios_base::openmode mode = ios_base::in | ios_base::out );
void open(const wchar_t *_Filename,
ios_base::openmode mode= ios_base::in | ios_base::out,
int prot = ios_base::_Openprot);
引數: filename 操作檔名
mode 開啟檔案的方式
prot 開啟檔案的屬性
mode的各種情況:
ios::in |
為輸入(讀)開啟檔案 |
ios::out |
為輸出(寫)開啟檔案 |
ios::ate |
初始位置:檔案尾 |
ios::app |
所有輸出附加在檔案尾 |
ios::turnc |
若檔案已存在先刪除檔案 |
ios::binary |
二進位制方式 |
ios::nocreate |
不建立檔案,檔案不存在的時候開啟失敗 |
ios:;replace |
不替代檔案,檔案存在的時候開啟失敗 |
這些方式可以使用或 “|”的方式一起使用。
prot情況:
0 |
普通檔案,開啟操作 |
1 |
只讀檔案 |
2 |
隱含檔案 |
3 |
系統檔案 |
比如說:
fstream inout //定義fstream類的一個物件
inout.open(filename,ios::in|ios::out|ios::binary)//表示開啟一個可讀可寫的二進位制檔案。
在例1中,並沒有使用顯式的呼叫open函式,而是使用一個類的物件直接開啟檔案,這種情況也是可行的。
ifstream fin("inputisbn.txt");//已有輸入檔案
ofstream fout("outisbn.txt");/已有輸出檔案
因為在stream類的建構函式中有open()函式,同樣建構函式也呼叫了open()函式,所以無需自己在操作。
重點:
每個類的預設開啟方式不同
類 |
預設開啟方式 |
fstream |
ios::in|ios::out預設建立檔案,除非指定ios::in或ios::nocreat |
istream |
ios::in 預設不建立檔案 |
ostream |
ios::out預設建立檔案,除非指定ios::nocreat |
檢查檔案是否正常開啟的方式:
is_open(),返回bool值,ture檔案被開啟,false相反。
其餘檢查檔案的方式:
bad()
如果在讀寫過程中出錯,返回 true 。例如:當我們要對一個不是開啟為寫狀態的檔案進行寫入時,或者我們要寫入的裝置沒有剩餘空間的時候。
fail()
除了與bad() 同樣的情況下會返回 true 以外,加上格式錯誤時也返回true,例如當想要讀入一個整數,而獲得了一個字母的時候。
eof()
如果讀檔案到達檔案末尾,返回true。
good()
這是最通用的:如果呼叫以上任何一個函式返回true 的話,此函式返回 false 。
要想重置以上成員函式所檢查的狀態標誌,你可以使用成員函式clear(),沒有引數。
2.設定流指標
在計算機中輸入和輸出是資料傳送的過程,資料如流水一樣從一處流向另一處。C++形象地將此過程稱為流(stream)。C++的輸入輸出流是指由若干位元組組成的位元組序列,這些位元組中的資料按順序從一個物件傳送到另一物件。流表示了資訊從源到目的端的流動。在輸入操作時,位元組流從輸入裝置(如鍵盤、磁碟)流向記憶體,在輸出操作時,位元組流從記憶體流向輸出裝置(如螢幕、印表機、磁碟等)。流中的內容可以是ASCII字元、二進位制形式的資料、圖形影象、數字音訊視訊或其他形式的資訊。
但是實際的操作過程中並不是流直接將資料融入需要的地方,比如說檔案,螢幕。而是經過一段緩衝區在緩衝區滿胡這是遇到endl後,將緩衝區的內容送走,並清空緩衝區。對於緩衝區在C++中也是用類來實現。流緩衝類streambuff,使用該類的成員可以訪問到流緩衝區中的資料。
對於cout物件來說,他預設的輸出是在標準輸出裝置(螢幕),cin是標準輸入裝置(鍵盤)。當我們需要使用其他的方式輸入或輸出就需要將輸入輸出重定向。
streambuf*cinbackup;
streambuf*coutbackup;
//定義兩個可以用來指向流緩衝區內容的流緩衝指標
/*rdbuf可用來將流重新定義到需要的地方
streambuf* rdbuf() const;
streambuf* rdbuf (streambuf* sb);
1)無引數。返回呼叫者的流緩衝指標。
2)引數為流緩衝指標。它使呼叫者與引數(流緩衝指標)關聯,返回自己當前關聯的流緩衝區指標。
*/
coutbackup=cout.rdbuf(fout.rdbuf());//用rdbuf()重定向
cinbackup=cin.rdbuf(fin.rdbuf());
/*這兩句程式碼可以擴充為:
coutbackup=cout.rdbuf(); /*coutbackop為當前的標準輸出流指標*/
cinbackup=cin.rdbuf(); /*cinbackup是當前的標準輸入流指標*/
cout.rdbuf(fout.rdbuf());
/*使用rdbuf()將當前的標準輸出流(螢幕)重定向到檔案的寫入流*/
cin.rdbuf(fin.rdbuf());
*/
cout<<"write"<<endl; //重定向完成後,使用cout就可以將資料寫入對應的檔案中
char line[100];
cin>>line;
//從inputisbn.txt檔案中讀資料(100個數據或者是遇到空格截止)
cout<<line; //將讀到的資料繼續寫入輸出檔案
大致檔案的重定向就是這些了,以上皆是本人自己的理解,若有問題請幫忙指出,不勝感激!
參考出處:
C++的輸入輸出與標準輸出流
http://blog.csdn.net/kingstar158/article/details/6859379/