1. 程式人生 > >STL(三)C++ I/O流技術

STL(三)C++ I/O流技術

    C++標準模板庫中,提供了一組模板類和相應的具現類,來支援面向物件的資料輸入輸出功能,如基本的輸入輸出流istream類/ostream類/iostream類和檔案輸入輸出流ifstream類/ofstream類/fstream類等。

一、I/O流類

  使用C++的I/O流類,需要用巨集語句"#include <iostream>" or "#include <fstream>"。

  由於支援單位元組和多位元組的字元資料讀寫,C++通過模板類來定製I/O流類

  如下圖:

  1. 首先是最底層的模板類basic_streambuf,具有基本的快取處理功能。其他模板類是basic_streambuf類的友員類,以利用它的底層讀寫功能進行操作。
  2. 接下來是ios_base類,提供基本的讀寫格式設定,讀寫狀態和錯誤檢測功能,是一個非模板類,其他模板類實際是從它派生出來。
  3. basic_ios在ios_base類基礎上將字元特性考慮進來,提供基本的字元資料輸入輸出處理。
  4. basic_istream, basic_ostream以及同時支援讀寫的basic_iostream,提供更確切的流資料的讀寫功能
  5. 用於檔案資料讀取的basic_ifstream,資料寫入的basic_ofstream以及可讀寫的basic_fstream,並使用了basic_streambuf模板類進行緩衝處理
  6. C++通過具現以上I/O流的模板類,提供了便於應用的單位元組和多位元組的I/O流類,包括單位元組的流類ios,istream,ostream,iostream,ifstream,ofstream and fstream,多位元組的流類wios,wistream,wostream,wiostream,wifstream,wofstream and wfstream。


二、標準輸入輸出

    為簡化控制檯的鍵盤和螢幕I/O處理,C++提供了4個內建的單位元組處理的流物件cin(預設鍵盤輸入), cout(預設螢幕輸出), cerr(標準錯誤輸出流物件,預設螢幕) and clog(帶緩衝的標準日誌輸出流物件,預設螢幕), 以及對應的4個雙位元組處理的流物件wcin, wcout, wcerr and wclog

    這些內建流物件在程式執行時就被分別呼叫istream and ostream流類的函式進行建立和初始化,並作用於早已由C提供出來的充當檔案指標的stdin標準輸入,stdout標準輸出、stderr標準錯誤。

三、檔案輸入輸出

   檔案讀寫所用到的很多常數都在基類ios中被定義出來。

(1)檔案 開啟:二進位制模式按位元組進行讀寫,不作任何資料轉換,資料不會丟失

(2)檔案 關閉:

(3)檔案讀寫:1、利用過載操作符“<<”和“>>”讀寫;2、讀寫一個字元,ifstream& get(char& c),oftream& put(char& c);3、讀寫多個字元,read and write;4、隨機讀寫,seekg and seekp,可移動檔案的讀寫指標來讀寫。

四、流的格式控制

    對於流資料的輸入輸出模式,C++提供兩種不同的控制方式,一種是使用ios_base類提供的setf, width等,另一種是操作符“<<”和“>>”以及流模式控制物件

(1)用函式設定或復位格式:檢視fmtflags  setf(fmtflags  flag)函式的使用

#include <iostream>
using namespace std;
int main(void) {
    //科學計數方式顯示,大寫“E“
    cout.setf(ios::scientific | ios::uppercase);
    cout << 2006.5 << endl;    //2.006500E + 03
    return 0;
}
(2)用過載“<<”或“>>”操作符設定流格式
//使用流格式控制物件
#include <iostream>
#include <iomanip>
using namespace std;
int main(void) {
    //設定域寬
    cout << setw(20) << "hello" << endl;
    //設定精度
    cout << setprecision(4) << 2006.536 << endl;
    //設定填充字元
    cout << setw(2) << setfill('*') << "baby" << endl;
    cout << scientific << 300.89 << endl;
    cout << oct << 9 << endl;
    cout << dec << showpos << 173 << endl;
    //取消正號顯示
    cout << noshowpos << 192 << endl;
    cout << boolalpha << true << endl;
    return 0;
}

小結:C++提供了十分完善的流類和內建的流物件,支援面向物件的裝置IO操作。

參考<<C++ STL技術開發引導>>