1. cerr和clog對象與標準錯誤流對應,但cerr不被緩衝。ios
2. streambuf類爲緩衝區提供了內存,並提供了用於填充緩衝區、訪問緩衝區內容、刷新緩衝區和管理緩衝區內存的類方法。ios_base類表示流的通常特徵(是否可讀取?二進制流?等,ios類基於ios_base,包含一個指向streambuf的指針成員c++
3. ostream提供了put和write方法,前者用於顯示字符,後者用於顯示字符串。write的第一個參數提供了要顯示的字符串地址,第二個指出要顯示多少個字符。須要注意的是write方法並不會在遇到空字符時中止打印字符,而是打印指定數目的字符,即便超出了字符串的邊界。app
4. 多數C++實現都會在輸入即將發生時刷新緩衝區。若是實現並不能在但願時刷新輸出,那麼可使用兩個控制符中斷一個強行刷新:控制符flush刷新緩衝區;控制符endl不只刷新緩衝區還插入一個換行符。事實上,控制符也是函數,能夠直接調用刷新,如flush(cout)。函數
5. cout 進行格式化,浮點數的老式實現和新實現有所不一樣,新實現當指數大於等於6或小於等於5時,用科學計數法表示,默認的行爲對應於帶%g說明符的標準C庫函數fprintf。測試
6. cout如何設置顯示整數時的計數系統:dec、hex和oct控制符,如hex(cout)編碼
7. cout調整字符寬度:spa
int width(); // 返回字段寬度的當前設置 int width(int i); // 將字段寬度設置爲i個空格,並返回之前的字符寬度值
width方法隻影響接下來顯示的一個項目,而後字段寬度將恢復爲默認值命令行
8. cout填充字符:在默認狀況下,cout使用空格填充字段中未被使用的部分,能夠用fill( )函數來改變填充字符,與字段寬度不一樣的是,新的填充字符一直有效,直到更改它爲止。指針
9. cout設置浮點數的顯示精度:使用precision函數設置精度rest
10. cout打印末尾的0和小數點:ios_base類提供了一個setf函數能夠控制多種格式化特性,這個類還定義了多個常量,可用做該函數的參數,例如使用ios_base::showpoint可使cout顯示末尾小數點,默認精度6位。
格式常量
常量 | 含義 |
---|---|
ios_base::boolalpha | 輸入和輸出bool值,值爲true/false |
ios_base::showbase | 對於輸出,使用C++基數前綴(0,0x) |
ios_base::showpoint | 顯示末尾小數點默認精度爲6 |
ios_base::uppercase | 對於16進制輸出,使用大寫字母,E表示法 |
ios_base::showpos | 在正數前面加上+,當且僅當基數爲10時才使用,十六進制和八進制C++都視爲無符號 |
setf有兩個原型,第一個原型以下:
fmtflags setf(fmtflags);
其中fmtflags是bitmask類型的typedef名,用於存儲格式標記。bitmask是一種存儲各個位值的類型,他能夠是整型、枚舉,也能夠是STL bitset容器,這裏的主要思想是每一位均可以單獨訪問,都有本身的含義。
第二個原型以下:
fmtflags setf(fmtflags ,fmtflags);
第一個參數和第一個原型同樣,第二個參數指出要清除第一個參數中的哪些位。
setf(long, long)的參數
第二個參數 | 第一個參數 | 含義 |
---|---|---|
ios_base::basefield | ios_base::dec | 使用基數10 |
ios_base::basefield | ios_base::oct | 使用基數8 |
ios_base::basefield | ios_base::hex | 使用基數16 |
ios_base::floatfield | ios_base::fixed | 使用定點計數法,至關於printf中的%f說明符 |
ios_base::floatfield | ios_base::scientific | 使用科學計數法,至關於printf中的%e說明符 |
ios_base::adjustfield | ios_base::left | 使用左對齊 |
ios_base::adjustfield | ios_base::right | 使用右對齊 |
ios_base::adjustfield | ios_base::internal | 符號或基數前綴左對齊,值右對齊 |
11. setf( )的效果能夠經過unsetf( )消除,沒有專門只是浮點數默認模式的標記,使用參數ios_base::floatfield調用unsetf( )都將切換到默認模式。
12. C++在頭文件iomanip中提供了其餘一些控制符,經常使用的是setprecision、setfill、setw,它們分別用來設置精度、填充字符和設置字段寬度,setprecision接受一個指定精度的整數參數,setfill控制符接受一個指定填充字符的char參數,setw控制符接受一個指定字段寬度的整數參數。
13. 流狀態由3個ios_base元素組成:eofbit、badbit、failbit
成員 | 描述 |
eofbit | 若是到達文件尾,則設置爲1 |
badbit | 若是流被破壞,則設置爲1 |
failbit | 若是輸入操做未能讀取預期的字符或輸出操做沒有寫入預期的字符,則設置爲1 |
goodbit | 另外一種表示0的方法 |
good( ) | 若是流可使用,則返回true |
eof( ) | 若是eofbit被設置,則返回true |
bad( ) | 若是badbit或failbit被設置,則返回true |
rdstate( ) | 返回流狀態 |
exceptions( ) | 返回一個位掩碼,指出哪些標記致使異常被引起 |
exceptions(isostate ex) | 設置哪些狀態將致使clear( )引起異常,默認設置爲goodbit,也就是沒有引起異常,運算符OR使得可以指定多位。 |
clear(iostate s) | 將流狀態設置爲s,其餘的清除,s的默認值爲0,若是(restate( )& exceptions( )) != 0,則引起異常base_ios::failure |
setstate(iostate s) | 這將設置與s中設置的位對應的流狀態位,其餘狀態爲保持不變 |
設置流狀態位有一個很是重要的後果:流將對後面的輸入或輸出關閉,直到位被清除。若是但願程序在流狀態位被設置後可以繼續讀取後面的輸入,就必須將流狀態重置爲良好,這能夠經過調用clear( )方法實現。但這還不足以從新設置流的狀態,致使輸入循環終止的不匹配輸入仍留在隊列中,程序必須跳過它。一種方法是,一直讀取字符知道到達空白爲止。isspace函數一個cctype函數,當參數是空白字符時返回true;另外一個方法是,丟棄行中的剩餘部分。
14. 單字符輸入get(char&)和get(void):提供不跳過空白的單字符輸入功能
(1)成員函數get(char& ):若是函數到達文件尾(不管是真正的仍是鍵盤仿真的),它都不會給其參數賦值。只要存在有效輸入,函數的返回一個指向用於調用它的istream得引用,這意味着能夠拼接get(char&)後面的其它抽取,此時斷定的結果是true,循環將繼續;到達文件尾時,返回值斷定爲false,循環終止。
(2)成員函數get(void):返回一個int值(或者其餘整型,取決於字符集和區域),這意味着他不可以抽取運算符。到達文件尾後(不管真實與否),函數都將返回EOF——頭文件iostream提供的一個符號常量,這也是返回值類型是int的緣由之一,由於值EOF可能不能用char類型表示
15. 字符串輸入getline( )、get( )、ignore( ):
istream& get(char* ,int, char); istream& get(char* ,int); istream& getline(char* ,int, char); istream& getline(char* ,int);
(1)第一個參數是用於放置輸入字符串的內存單元地址,第二個參數必要讀取的最大字符數大1,第三個參數指定用做分界符的字符,只有兩個參數的版本將換行符用做分界符。get( )和getline( )之間的區別在於,get( )將換行符留在輸入流中,而getline抽取並丟棄輸入流中的換行符。igone( )函數丟棄符合條件的字符串,它接受兩個參數,第一個是要讀取的最大字符數,第二個是分界符,原型爲爲兩個參數提供的默認值爲1和EOF,返回類型爲istream &。
(2) getline方法若是遇到文件尾則設置eofbit,若是要讀取的字符是換行符則讀取並丟棄,若是讀取結束,但下一個字符不是換行符,則設置failbit;get(char*, int) 首先測試字符數,而後測試是否爲文件尾以及下一個字符是否是換行符。若是它讀取了最大數目的字符,則不設置failbit標記。能夠用peek來查看下一個輸入字符,若是它是換行符,這說明get已經讀取了整行,不然沒讀完,這個方法對getline不適用,由於它讀取並丟棄換行符。
16. 其餘istream方法:
(1)read( )與getline( )和get( )不一樣,不會在輸入後加上空值字符,所以不能將輸入轉化爲字符串,它常與ostream write( )函數結合使用,來完成文件輸入輸出。
(2)peek( )返回輸入中的下一個字符,但不抽取輸入流中的字符
(3)gcount( )返回最後一個非格式化抽取方法讀取的字符數,這意味着字符是由get( )、getline( )、ignore( )或read( )方法讀取的,不是抽取運算符>>讀取的。
(4)pushback( )將一個字符插入到輸入字符串中,被插入的字符是下一條輸入語句讀取的第一個字符,返回類型是istream&。
17. 較新的C++實現提供了一種更好檢查文件是否被打開的方法——is_open( )方法,該方法可以檢測到程序正試圖以不合適的文件模式打開文件致使失敗以及老式方法fin.good( ) 能檢測到的錯誤。
18. C++有一種能讓在命令行環境中運行的程序可以訪問命令行參數的機制,方法是使用下面的main函數:
int main(int argc, char* argv[])
argc是命令行中參數的個數,包含命令名自己;argv是一個指針,指向命令行中的字符串參數
19. 有些C++實現要求在程序末尾使用fin.clear( ),有些則不要求,這取決於將文件與ifstream對象關聯起來時,是否自動充值流狀態。使用fin.clear( )是無害的,即便在沒必要使用它的時候使用。
20. C++文件模式常量:
常量 | 含義 |
ios_base::in | 打開文件,以便讀取 |
ios_base::out | 打開文件,以便寫入 |
ios_base::ate | 打開文件,並移到文件尾 |
ios_base::app | 追加到文件尾 |
ios_base::trune | 若是文件存在,則截短文件 |
ios_base::binary | 二進制文件 |
21. ifstream.open( )方法和構造函數用ios_base::in(打開文件以讀取)做爲模式參數的默認值,而ofstream.open( )和構造函數用ios_base::out | ios_base::trunc做爲默認值。
22. C++和C的文件打開模式
C++模式 | C模式 | 含義 |
ios_base::in | "r" | 打開以讀取 |
ios_base::out 或者 ios_base::out | ios_base::trunc | "w" | 等價於ios_base::out | ios_base::trunc |
ios_base::out | ios_base::app | "a" | 打開以寫入,只追加 |
ios_base::in | ios_base::out | "r+" | 打開以讀寫,在文件容許的位置寫入 |
ios_base::in | ios_base::out | ios_base::trunc | "w+" | 打開以讀寫,若是已存在則首先截短文件 |
c++mode | ios_base::binary | "cmodeb" | 以C++mode(或相應的cmode)和二進制模式打開 |
c++mode | ios_base::ate | "cmode" | 以指定的模式打開,並移到文件尾。C使用一個獨立的函數調用而不是模式編碼。 |
23. fstream提供了兩個在文件中移動的方式:seekg( ) 和 seekp( ),前者將輸入指針移到指定的文件位置,後者將輸出指針移動到指定的文件位置,實際上,因爲fstream使用緩衝區來存儲中間數據,所以指針指向的是緩衝區中的位置,而不是實際的文件。可使用seekg來移到文件的開頭。下面是seekg的兩個原型:
basic_istream<charT, traits>& seekg(off_type, ios_base:seekdir); basic_istream<charT, traits>& seekg(pos_type);
第一個原型:第一個參數是相對於文件特定位置的偏移量(單位爲字節),第二個爲文件位置特定值,它有三個可能的值:ios_base::beg(文件開始處),ios_base::cur(當前位置),ios_base::end(文件尾)。
第二個原型:參數是定位到文件中的一個位置,是文件中從文件開始處算起的絕對位置。它能夠是類,但必須包含一個接受pos_type參數的構造函數和一個接受整數參數的構造函數,以便將這兩種值轉換爲pos_type值。
24. 若是要檢查文件指針的當前位置,對於輸入流可使用tellg方法,對於輸出流可使用tellp方法。
25. 建立fstream對象時,輸入輸出指針將一前一後地移動,由於tellg和tellp返回的值相同。然而若是使用istream對象管理輸入流,使用ostream管理同一個文件的輸出流,則輸入輸出指針框彼此獨立的移動,所以tellg和tellp將返回不一樣的值。
26. 可使用cstdio中聲明的tmpnam生成TMP_NAM個不一樣的文件名,其中每一個文件名包含的字符不超過L_tmpnam個。
27. iostream族支持程序和終端之間的I/O,而fstream使用相同的接口提供程序和文件之間的I/O,sstream使用相同的接口提供程序和string對象之間的I/O。