目錄結構:ios
除了istream和ostream以外,標準庫還定義了其它的一些類型。以下表:c++
頭文件 | 類型 |
iostream | istream,wistream 從流讀取數據app ostream,wostream 向流寫入數據函數 iostream,wiostream 讀寫流spa |
fstream | ifstream,wifstream 從文件讀取數據code ofstream,wofstream 向文件寫入數據對象 fstream,wfstream 讀寫文件blog |
sstream | istringstream,wistringstream 從string讀取數據seo ostringstream,wostringstream 向string寫入數據圖片 stringstream,wstringstream 讀寫string |
爲了支持寬字符的語言,標準庫還定義了一組類型和對象來操做wchar_t類型的數據。寬字符版本和函數的名字以一個w開始。例如,wcin,wcout和cerr,分別對應cin,cout,cerr的寬字符版本。
下面這種圖片更詳細的列舉了,c++中流的基本體系:
不能拷貝和對IO對象賦值:
fstream out1,out2; out1 = out2; //錯誤,不能對流對象賦值 ofstream print(ofstream); //錯誤,不能初始化ofstream參數 out2 = print(out2); //錯誤,不能拷貝流對象
因爲不能拷貝IO對象,所以咱們也不能將形參或返回類型設置爲流類型。進行IO操做的函數一般以引用的方式傳遞和返回流。
C++類提供了一些列的函數和標誌,能夠幫助咱們訪問和操縱流的條件狀態,下表列舉了一些函數和標誌:
strm::iostate | strm流的iostate類靜態成員,提供了表達式狀態的完整功能 |
strm::badbit | strm流的badbit類靜態成員,指出流已經崩潰 |
strm::failbit | strm流的failbit類靜態成員,指出流操做失敗了 |
strm::eofbit | strm流的eofbit類靜態成員,指出流達到了文件末尾 |
strm::goodbit | strm流的goodbit類靜態成員,指出流處於正常狀態,未發生任何錯誤 |
s.eof() | 若流s的eofbit置位,則返回true |
s.fail() | 若流s的failbit或badbit置位,則返回true |
s.bad() | 若流s的badbit置位,則返回true |
s.good() | 若流s處於有效狀態,則返回true |
s.clear() | 將流s中的全部條件狀態位復位,將流的狀態設置爲有效。 |
s.clear(flags) | 根據給定的flags標誌位,將流s中對應的條件狀態位復位。flags的類型是strm::flags |
s.setstate(flags) | 根據給定的flags標誌位,將流s中的對應條件狀態位置位。flags的類型是strm::flags |
s.rdstate() | 返回流s的當前條件狀態,返回值類型爲strm::iostate。 |
咱們能夠使用以下的代碼判斷流的狀態:
std::ifstream strm; if(strm.good()){ //繼續操做 }
因爲流重載了布爾運算符,
explicit operator bool() const;
若是failbit和badbit被置位,則返回false。不然返回true。
有了布爾運算符,咱們就能夠輕鬆的判斷流的狀態。
std::ifstream is; is.open ("test.txt"); if (is) { //編譯器會編譯爲if(is.good()) // 操做文件 } else { std::cerr << "Error opening 'test.txt'\n"; }
頭文件fstream定義了三個類型來支持文件IO,ifstream從一個給定的文件讀取數據,ofstream從一個向一個給定的文件寫入數據,以及fstream能夠讀寫文件。
讀寫文件的步驟:
1.建立文件流對象
2.打開文件
3.讀寫數據
4.關閉文件
例如:
#include <fstream> // std::fstream int main () { std::fstream fs;//建立對象 fs.open ("test.txt");//打開文件 fs << " more lorem ipsum";//寫入數據 fs.close();//關閉文件 return 0; }
每一個流都有一個關聯的模式,用來指出如何使用文件。例如:
in | 以讀的方式打開 |
out | 以寫的方式打開 |
app | 每次寫操做前均定位到文件末尾 |
ate | 打開文件當即定位到文件末尾 |
trunc | 截斷文件 |
binary | 以二進制方式進行 |
當打開一個文件的時候,能夠指定一個文件模式,指定模式有以下限制:
1.只能夠對ofstream或fstream對象設定out模式
2.只能夠對ifstream或fstream對象設定in模式
3.只有當out模式被設定時才能夠設定trunc模式
4.只要trunc沒有被設定,就能夠設定app模式。在app模式下,即便沒有顯式指定out模式,文件也老是以輸出方式打開。
5.默認狀況下,即便咱們沒有指定trunc模式,以out模式打開的文件也會被截斷。爲了保留以out模式打開的文件的內容,咱們必須同時指定app模式,這樣只會將數據追加到文件末尾;或者同時指定in模式,即打開文件同時進行讀寫操做
6.ate和binary模式能夠用於任何類型的文件流對象,且能夠與其餘任何文件模式組合使用。
每一個文件流都有一個默認的文件模式,ifstream關聯的文件默認以in模式打開,ofstream關聯的文件默認以out模式打開,fstream關聯的文件默認以in和out模式打開。
例如:
ofstream out; // 未指定文件打開模式 out.open("test.txt"); // 模式隱含設置爲輸出和截斷 out.close(); // 關閉out out.open("test2.txt",ofstream::app); //模式爲輸出和追加 out.close(); //關閉out
sstring頭文件定義了三個類型來支持內存IO操做,這些類型能夠向string寫入數據,從string讀取數據,就像string是一個IO流同樣。
istringstream從string讀取數據,ostringstream向string寫入數據,stringstream既能夠向string寫入數據也能夠向string讀取數據。
下面是關於stringstream的常規操做:
sstream strm | 是一個未綁定的stringstream對象 |
sstream strm(s) | strm是一個stringstream對象,保存了string s的拷貝。 |
strm.str() | 返回strm所保存的string的拷貝 |
strm.str(s) | 將string s拷貝到stream中 |
例如:
#include <string> // std::string #include <iostream> // std::cout #include <sstream> // std::stringstream, std::stringbuf int main () { std::stringstream ss; //建立stringstream對象 ss.str ("Example string"); //將字符串拷貝到stringstream中 std::string s = ss.str(); //得到stringstream中保存的字符串 std::cout << s << '\n'; //輸出 std::string word; while(ss >> word)//從stringstream中讀取每個單詞 std::cout << word << '\n'; std::cout << std::endl; return 0; }