C++包括兩類IO庫,一種是基於流形式的IO庫,另一種是C風格的IO函數庫,下面我會分別來闡述,重點還是放在C++的流形式IO上。
IO類
IO類繼承關系
基於流的輸入和輸出圍繞抽象的輸入輸出設備組織而成,這些抽象輸入輸出設備包括控制台窗口,文件和內存中的string對象,並且這些類都是模板化的,類的繼承形式如下:
C++的IO類繼承架構圖
在上面的繼承關系圖中,
ios_base是接口類,主要管理格式符號和輸入輸出異常,通常我們不對其進行直接操作,我們需要使用基類時也是使用
basic_ios,用其來管理任意的流操作。不過我們在日常使用中,不會直接使用上圖中的類名,而是通過了別名來進行調用,別名的用法如下代碼所示,其中以w開頭的都是寬字符類型使用的。在IO流的使用中,
一定要注意的是不能夠使用拷貝構造和賦值語句<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPqOs0vLOqtTau/nA4NbQ1eLQqbqvyv2+zdLRvq2xu8u909C7r8HLoaO7udPQwb249r/iaW9tYW5pcLrNc3RkaW9zdHJlYW3Q6NKqudjXoqOsx7DV38n5w/fBy7jxyr27r0lPtcTSu9CpstnX96OsuvPV39PD09q77LrPyrnTw0O6zUMrK7XESU+7+tbGoaMNCjxwPiZuYnNwOzwvcD4NCjxwcmUgY2xhc3M9"brush:java;">
/* Defined in header */
typedef basic_ios ios;
typedef basic_ios wios;
/* Defined in header */
typedef basic_streambuf streambuf;
typedef basic_streambuf wstreambuf;
/* Defined in header */
typedef basic_filebuf filebuf;
typedef basic_filebuf wfilebuf;
/* Defined in header */
typedef basic_stringbuf stringbuf;
typedef basic_stringbuf wstringbuf;
/* Defined in header */
typedef basic_istream istream;
typedef basic_istream wistream;
/* Defined in header */
typedef basic_ostream ostream;
typedef basic_ostream wostream;
/* Defined in header */
typedef basic_iostream iostream;
typedef basic_iostream wiostream;
/* Defined in header */
typedef basic_ifstream ifstream;
typedef basic_ifstream wifstream;
typedef basic_ofstream ofstream;
typedef basic_ofstream wofstream;
typedef basic_fstream fstream;
typedef basic_fstream wfstream;
/* Defined in header */
typedef basic_istringstream istringstream;
typedef basic_istringstream wistringstream;
typedef basic_ostringstream ostringstream;
typedef basic_ostringstream wostringstream;
typedef basic_stringstream stringstream;
typedef basic_stringstream wstringstream;
我們平時接觸最多的還是標准庫中已經被預定義的cin(wcin),cout(wcout),cerr(wcerr),clog(clog),他們分別對應著標准輸入流,標准輸出流,標准錯誤輸出流和標准日志輸出流,不過可以通過rdbuf()方法來改變這些流對象的緩沖區,也就改變了這些流對象的標准功能,注意cerr流無緩沖區。
條件狀態
在流對象中有一個非常重要的特性是條件狀態,通過該特性我們可以了解一個流對象的當前狀態以及是否能正常工作,因為當一個錯誤發生時,該流對象隨後的操作就必然會失敗。所有的流對象都有如下四種條件狀態:goodbit,badbit,eofbit,failbit。goodbit代表流對象正常,badbit代表該流對象崩潰了,不可恢復,eofbit表示該流對象已經處於流的結束位置,failbit表示某次IO操作失敗,但該錯誤可恢復。同時還提供了一些方法如eof(),fail(),bad(),good(),clear(),setstate(),rdstate()等來對條件狀態進行判斷和操作。我們以一段代碼來說明如何使用這些方法:
#include
#include
#include
using namespace std;
int main(int argc, char* argv[])
{
string obj{"just a test!"};
stringstream ss(obj);
stringstream::iostate state = ss.rdstate(); /* 讀取該流對象中的條件狀態 */
ss.setstate(state | stringstream::failbit); /* 將該流對象的failbit置位 */
string tmp;
while(ss>>tmp) /* 因為錯誤存在,該流對象不會輸入 */
{
cout<>tmp)
{
cout<結果:
true
another
test!
true
接下來我用一個表格來說明條件狀態位與條件判斷方法的關系: