C++三大IO流類總結——標準IO流、文件IO流、內存IO流

IO流類一覽

  • ios:流基類(抽象類)
  • istream:通用輸入流類和其他輸入流的基類
  • ostream:通用輸出流類和其他輸出類的基類
  • iostream:通用輸入輸出流類和其他輸入輸出流類的基類
  • ifstream:輸入文件流類
  • ofstream:輸出文件流類
  • fstream:輸入輸出文件流
  • istrstream:輸入字符串流類
  • ostrstream:輸出字符串流類
  • strstream:輸入輸出字符串類
  • iostream_withassign: 通用輸入輸出流類和其他輸入輸出流類iostream的的派生類

關係圖如下:

派生
派生
派生
派生
派生
派生
派生
派生
派生
ios類:流基類
istream:通用輸入流類
ostream:通用輸出流類
iostream:通用輸入輸出類
ifstream:輸入文件流類
istringstream:輸入字符串流類
ofstream:輸出文件流類
ostringstream:輸出字符串流類
fstream:輸入輸出文件流類
stringstream:輸入輸出字符串流類

標準IO流

C++中包含幾個預定義的流對象,即標準IO流,它們是標準輸入流對象cin、標準輸出流對象cout、非緩衝型的標準出錯流對象cerr、緩衝型的標準出錯流對象clog。

  • cin是istream的派生類istream_withassign的對象,它與標準輸入設備(通常是鍵盤)相聯繫。
  • cout是ostream的派生類ostream_withassign的對象,它與標準輸出設備(通常是顯示器)相聯繫。
  • cerr是ostream的派生類ostream_withassign的對象,它與標準錯誤輸入設備(通常是顯示器)相聯繫。
  • clog是ostream的派生類ostream_withassign的對象,它與標準錯誤輸入設備(通常是顯示器)相聯繫。

標準IO流的條件狀態

C++語言IO類中定義了一些函數和標誌,可以用來訪問IO流的條件狀態。

一旦一個流發生錯誤,對其進行IO操作都無法進行。可以將流作爲條件判斷,這也是最簡單的一種方式,但這樣無法知曉 流的具體錯誤。通過IO類中的條件狀態函數,可以知道流操作爲什麼失敗。

條件狀態標誌

strm::iostate:條件狀態集合
strm::badbit:指示流是否崩潰
strm::failbit:表示一個IO操作失敗
strm::eofbit:表示到流遇到結束標誌
strm::goodbit:表示流正常使用

條件狀態函數

對於標準IO流s,有如下成員函數
s.setstate(flag):將流s狀態置爲flag,返回void
s.rdstate():返回流s的當前狀態,返回類型爲strm::iostate
s.eof():若eofbit置位則返回true,表示到達流s末尾
s.fail():若badbit或failbit置位,則返回true
s.good():若流s處於有效狀態,則返回true
s.clear():清空各個狀態位,將流置爲有效
s.clear(flag):復位flag中設置的標誌位。可以先使用rdstate()讀取到流標誌位,進行位操作,作爲flag參數傳入。

標準IO流的輸入輸出成員函數

  • put函數
    put函數用於輸出一個字符格式:cout.put(char ch)
    例如:輸出A可以採用以下方法:
    cout.put('A'); cout.put(65) ; cout.put(25+40);

  • get函數
    get函數的功能與提取運算符>>類似,主要不同之處是get函數在讀入數據時可以包括空白字符,而後者不可以。

    • get函數用於讀入一個字符,調用形式:cin.get()
    • get函數用於傳入一個字符到char型變量,調用形式:cin.get(char ch)
  • getline函數
    getline函數用於從輸入流讀取n-1個字符,賦給指定的字符數組(或字符指針指向的數組),然後插入一個字符串結束志"\n"。("\n"可以用其他字符代替)遇到’\n‘會提前終止讀取字符。

    getline函數調用格式:

    • cin.getline(字符數組,字符個數n,終止標誌字符)
    • cin.getline(字符指針,字符個數n,終止標誌字符)
  • ignore函數
    ignore函數的功能是跳過輸入流的n個字符(默認的個數爲1),或在遇到指定的終止符時 提前結束。
    調用格式:cin.ignore(n,終止字符);cin.ignore();cin.ignore(1,EOF)

代碼示例

條件狀態
#include <iostream>
using namespace std;

int main() {

    cout<<"初始狀態:"<<endl;
    //cout<<"failbit: "<<cin.failbit<<endl;
    cout<<"fail(): "<<cin.fail()<<endl;
    //cout<<"badbit: "<<cin.badbit<<endl;
    cout<<"bad(): "<<cin.bad()<<endl;
    //cout<<"eofbit: "<<cin.eofbit<<endl;
    cout<<"eof(): "<<cin.eof()<<endl;
    //cout<<"goodbit: "<<cin.goodbit<<endl;
    cout<<"good(): "<<cin.good()<<endl;

    int i;

    cout<<"在這裏我們輸入EOF:"<<endl;
    cin>>i;

    cout<<"輸入EOF後:"<<endl;
    cout<<"fail(): "<<cin.fail()<<endl;
    cout<<"bad(): "<<cin.bad()<<endl;
    cout<<"eof(): "<<cin.eof()<<endl;
    cout<<"good(): "<<cin.good()<<endl;

    cout<<"先clear(),在這裏我們正常輸入一個數字:"<<endl;

    cin.clear();
    cin>>i;

    cout<<"正常輸入數字後:"<<endl;

    cout<<"fail(): "<<cin.fail()<<endl;
    cout<<"bad(): "<<cin.bad()<<endl;
    cout<<"eof(): "<<cin.eof()<<endl;
    cout<<"good(): "<<cin.good()<<endl;

    cout<<"在這裏我們輸入一個字符串:"<<endl;
    cin>>i;
    cout<<"輸入字符串後:"<<endl;

    cout<<"fail(): "<<cin.fail()<<endl;
    cout<<"bad(): "<<cin.bad()<<endl;
    cout<<"eof(): "<<cin.eof()<<endl;
    cout<<"good(): "<<cin.good()<<endl;
    
    return 0;
}
put和get函數
#include<iostream>
using namespace std;
int main()
{
 char ch;
 cout<<"Input:";
 while(cin.get(ch))   //讀取輸入的字符,直到結束爲止 
  {
   cout.put(ch);      //輸出字符 
  } 
  return 0;
}
/*
程序運行結果是:
 input:123 abc xyz
 123 abc xyz 
*/
getline函數
#include<iostream>
using namespace std;
int main()
{
 char ch[20];
 cout<<"輸入一行字符:"<<endl;
 cin.getline(ch,21,'t');
 cout<<ch<<endl;;
 return 0;
}
/*
程序運行結果是:
輸入一行字符:
shdfjsfefrsdfjt
shdfjsfefrsdfj 
*/

標準IO的格式控制

輸出格式控制
緩衝區控制
  • <<endl: 輸出換行符, 刷新緩衝區
  • <<ends: 輸出空字符, 刷新緩衝區
  • flush: 刷新緩衝區
控制bool類型格式
  • <<boolalpha: 輸出true 或者 false
  • <<noboolalpha: 輸出0或1
進制控制
  • <<oct: 八進制格式輸出
  • <<dec: 十進制格式輸出
  • <<hex: 十六進制格式輸出
  • <<showbase: 輸出指明進制類型, 0代表八進制,0x代表16進制
  • <<noshowbase: 輸出不指明進制類型
其他常用輸出格式控制
  • cout.precision(int n)或者cout<<prcision(int n): 設置浮點數打印位數爲n
  • <<showwpoint: 總是打印浮點數小數點
  • <<noshowpoint: 有小數部分纔打印小數點
  • <<setw(int n): 指定打印寬度爲n
  • <<left'或<<right`: 設置左對齊或者右對齊(默認對齊)
  • <<setfill(char ch): 設定填充字符,默認是空格
輸入格式控制
  • >>skipws: 輸入跳過空白符
  • >>noskipws: 輸入不跳過空白符

文件輸入輸出流

根據繼承關係可以知道,文件輸入輸出流繼承了iostream流類的所有成員函數,同時多了一些自身特有的成員函數和操作如下:

  • 文件流的關聯
    fin.open(“test.txt”,ios::binary) //從文件讀取數據
    fout.open(“test.txt”,ios::binary) //輸出到文件,向文件寫數據
    fboth.open(“test.txt”,ios::in|ios::out|ios::binary) //讀寫都可以
    或者
    ifstream fin(“test.txt”,ios::binary)
    ofstream fout(“test.txt”,ios::binary)
    fstream fboth(“test.txt”,ios::in|ios::out|ios::binary)

  • 標誌位含義:
    ios::in 打開文件做讀操作
    ios::out 打開文件做寫操作,會刪除原有數據
    ios::app 在每次寫之前找到文件尾
    ios::trunc 打開文件時清空已存在的文件流
    ios::ate 打開文件後立即定位到文件末尾
    ios::binary 以二進制模式進行IO操作

  • 文件流的關閉: 調用close()成員函數

字符串輸入輸出流類

字符串流和文件流操作基本一致相同,區別在於:

  • 輸出時數據不是流向外存文件,而是流向內存中的一個存儲空間。輸入時從內存中的存儲空間讀取數據,因此又稱內存輸入輸出流類.
  • 字符串流對象關聯的不是文件,而是內存中的一個存儲空間,因此不需要打開和關閉文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章