C++ 中輸入輸出流及檔案流操作筆記

沙米筆記發表於2016-09-11

1、流的控制

175046_xbxt_1783725

iomanip          在使用格式化I/O時應包含此標頭檔案。
stdiostream   用於混合使用C和C + +的I/O機制時,例如想將C程式轉變為C++程式

2、類繼承關係

175122_zgaf_1783725
ios是抽象基類,由它派生出istream類和ostream類, iostream類支援輸入輸出操作,iostream類是從istream類和ostream類通過多重繼承而派生的類

類ifstream繼承了類istream,類ofstream繼承了類ostream,類fstream繼承了 類iostream

iostream標頭檔案中4種流物件

物件 含義 對應裝置

對應的類

c語言中相應的標準檔案
cin 標準輸入流 鍵盤 istream_withassign stdin
cout 標準輸出流 螢幕 ostream_withassign stdout
cerr 標準錯誤流 螢幕 ostream_withassign stderr
clog 標準錯誤流 螢幕 ostream_withassign stderr

cout補充

1、用“cout<<”輸出基本型別的資料時,可以不必考慮資料是什麼型別,系統會判斷資料的型別

並根據其型別選擇呼叫與之匹配的運算子過載函式。這個過程都是自動的,使用者不必干預。

如果在C語言中用prinf函式輸出不同型別的資料,必須分別指定相應的輸出格式符,十分麻煩,而且容易出錯

2、cout流在記憶體中對應開闢了一個緩衝區,用來存放流中的資料,當向cout流插 人一個endl時,

不論緩衝區是否已滿,都立即輸出流中所有資料,然後插入一個換行符, 並重新整理流(清空緩衝區)。

注意如果插人一個換行符”\n“(如cout<<a<<“\n”),則只輸出和換行,而不重新整理cout 流(但並不是所有編譯系統都體現出這一區別)。

3、在iostream中只對”<<“和”>>”運算子用於標準型別資料的輸入輸出進行了過載,但未對使用者宣告的型別資料的輸入輸出 進行過載。

如果使用者宣告瞭新的型別,並希望用”<<“和”>>”運算子對其進行輸入輸出,按照重運算子過載來做。

cout 流通常是傳送到顯示器輸出,但也可以被重定向 輸出到磁碟檔案,而cerr流中的資訊只能在顯示器輸出

cerr是不經過緩衝區,直接向顯示器上輸出有關資訊,而clog中的資訊存放在緩衝區中,緩衝區滿後或遇endl時向顯示器輸出

3、標準輸入流 cin

重點掌握的函式

cin.get()                 //讀入一個字元並返回它的值
cin.get(一個引數)  //讀入一個字元並把它儲存在ch
cin.get(兩個引數)  //可以讀取字串
cin.get(三個引數)  //可以讀字串
cin.getline()
cin.ignore()           //讀取字元並忽略指定字元
cin.peek()            //檢查下一個輸入的字元,不會把字元從流中移除
cin.putback()       //返回一個字元給一個流

重要

1、使用cin,從流中讀出的字元,流中就沒有這字元了,再次讀取時只能讀取剩下的
2、緩衝去只有在遇到EOF、手動敲回車、流(快取區)滿時,才將流中的字元全部讀出(即清空快取區)

練習

1、從流中取一個字元,然後在放進去;
2、判斷流中的第一個字元是不是放進去的那個字元;
3、從流中讀取10個字元;
4、從流中忽略5個字元,再讀取10個字元;
5、最後讀取剩下的字元,最後輸出讀到的所有字元

輸出:

4、標準輸出流 cout

  流成員函式

174816_h2ml_1783726

cout.flush()      //清空緩衝區
cout.put()        //把字元寫入流中
cout.write()      //將字串寫入當前輸出流中

174631_vi3u_17837257

eg : cout.setf( ios::dec );

cout.setf(ios::hex,ios::basefield);【建議使用這種】

需注意:

1、fmtflags setf( fmtflags flags ); 使用這種,一定要先取消當前基【cout.unself()】,之後才可以設定新的基

2、fmtflags setf( fmtflags flags, fmtflags needed ); 使用這種,第二個引數設為當前的基,或者當不知道當前基時,設為ios_base::basefield清除當前的所有可能的基

  控制符,標頭檔案<iomanip>

174039_4a0h_17837258

eg:  cout<<setw(5);

5、檔案I/O

由於檔案裝置並不像顯示器螢幕與鍵盤那樣是標準預設裝置,不能像cout那樣預先定義的全域性物件,所以我們必須自己定義一個該類的物件

ifstream類,它是從istream類派生的,用來支援從磁碟檔案的輸入。

ofstream類,它是從ostream類派生的,用來支援向磁碟檔案的輸出。

fstream類,它是從iostream類派生的,用來支援對磁碟檔案的輸入輸出。

檔案原理

檔案開啟都有一個檔案指標,該指標的初始位置由I/O方式指定,每次讀寫都從檔案指標的當前位置開始。每讀入一個位元組,指標就後移一個位元組。當檔案指標移到最後,就會遇到檔案結束EOF(檔案結束符也佔一個位元組,其值為-1),此時流物件的成員函式eof的值為非0值(一般設為1),表示檔案結束 了。

檔案關閉,實際上是解除該磁碟檔案與檔案流的關聯,原來設定的工作方式也失效,這樣,就不能再通過檔案流對該檔案進行輸入或輸出

檔案型別:

1、ASCII檔案:檔案的每一個位元組中均以ASCII程式碼形式存放資料,即一個位元組存放一個字元,這個檔案就是ASCII檔案(或稱字元檔案)。

2、二進位制檔案:檔案中的資訊不是字元資料,而是位元組中的二進位制形式的資訊,因此它又稱為位元組檔案

常用函式

開啟檔案:

133556_m6t6_17837259

方式1:對檔案輸出流、檔案流物件,通過ofstream類的建構函式開啟檔案

格式: ofstream (磁碟檔名, 輸入輸出方式);

如果ofstream  為0(假),表示開啟操作失敗

如:   ofstream fout1(fname,ios::out);

輸入輸出方式可以使用能夠進行組合使用的,以“或”運算(“|”)的方式,如:fstream fout(fname,ios::out|ios::in)

方式2:對檔案的輸出和輸入流物件、檔案流物件,都可通過open函式開啟檔案

格式: 檔案流物件.open(磁碟檔名, 輸入輸出方式);

返回值:為0(假),開啟操作失敗

如:   fout.open(fname,ios::out)

關閉檔案:

在對已開啟的磁碟檔案的讀寫操作完成後,必須要關閉該檔案  如:  outfile.close( );

檔案操作

1、可以用流插入運算子“<<”和流提取運算子“>>”輸入輸出標準型別的資料(>> 讀出時在遇空格、換行都結束)。

2、也可以用檔案流的put、get、geiline等成員函式進行字元的輸入輸出。

二進位制檔案操作

對二進位制檔案的讀寫主要用istream類的成員函式read和write來實現。這兩個成員函式的原型為

istream& read(char *buffer,int len);

ostream& write(const char * buffer,int len);

輸出:

 

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

C++ 中輸入輸出流及檔案流操作筆記

相關文章