1. 程式人生 > >C++ 檔案重定向

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.openfilename,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::inios::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/