C++三大IO流類總結——標準IO流、文件IO流、內存IO流
IO流類一覽
- ios:流基類(抽象類)
- istream:通用輸入流類和其他輸入流的基類
- ostream:通用輸出流類和其他輸出類的基類
- iostream:通用輸入輸出流類和其他輸入輸出流類的基類
- ifstream:輸入文件流類
- ofstream:輸出文件流類
- fstream:輸入輸出文件流
- istrstream:輸入字符串流類
- ostrstream:輸出字符串流類
- strstream:輸入輸出字符串類
- iostream_withassign: 通用輸入輸出流類和其他輸入輸出流類iostream的的派生類
關係圖如下:
標準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)
- get函數用於讀入一個字符,調用形式:
-
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()成員函數
字符串輸入輸出流類
字符串流和文件流操作基本一致相同,區別在於:
- 輸出時數據不是流向外存文件,而是流向內存中的一個存儲空間。輸入時從內存中的存儲空間讀取數據,因此又稱內存輸入輸出流類.
- 字符串流對象關聯的不是文件,而是內存中的一個存儲空間,因此不需要打開和關閉文件。