C++緩沖區(qū),IO模型,流,對(duì)象
1.為什么沒有緩沖區(qū),數(shù)據(jù)讀取效率低??
緩沖區(qū)就是內(nèi)存中的區(qū)域,如果沒有緩沖區(qū),程序就不能和內(nèi)存交互,只能和硬盤交互。硬盤存儲(chǔ)信息以512字節(jié)(或更多) 的塊為單位,那傳輸信息自然也是;而程序只能一個(gè)字節(jié)一個(gè)字節(jié)地讀取數(shù)據(jù),二者讀取的速率并不匹配,硬盤先要把512字節(jié)取出來(lái),然后等待程序逐字節(jié)地讀取數(shù)據(jù),在程序完成讀取之前,硬盤處于等待狀態(tài),這樣并沒有發(fā)揮硬盤讀取數(shù)據(jù)的能力,另外程序需要大量與硬盤交互,這樣會(huì)造成許多額外的開銷。因此,我們考慮緩沖區(qū),硬盤先把數(shù)據(jù)放到緩沖區(qū)(內(nèi)存)中,然后程序逐字節(jié)地讀取數(shù)據(jù),由于內(nèi)存讀取速度快于硬盤,并且硬盤可以一直向緩沖區(qū)傳輸數(shù)據(jù)而無(wú)需等待,從而大大地提升讀取效率!
2.鍵盤輸入為什么需要緩沖區(qū)?
對(duì)于鍵盤輸入,每次按鍵地?cái)?shù)據(jù)量十分小(通常只有一個(gè)字符),而用戶按鍵頻率低,因此鍵盤產(chǎn)生的數(shù)據(jù)可以被程序接受而無(wú)需緩沖區(qū),那么設(shè)置緩沖區(qū)的目的是什么呢?
設(shè)置緩沖區(qū)是為了給予用戶“容錯(cuò)”的機(jī)會(huì),用戶輸入的字符會(huì)被保留在緩沖區(qū),如果用戶不小心輸錯(cuò)了,可以在緩沖區(qū)中修改,然后按下回車(換行),表示輸入完成,然后程序再讀取數(shù)據(jù)。如果沒有緩沖區(qū),從鍵盤中輸入的任何字符都將直接送給程序,這十分“冒進(jìn)”!
3.在C++中,對(duì)象代表流?
對(duì)象代表流,其中「對(duì)象」是指通過(guò)「類類型」創(chuàng)建的「類對(duì)象」,「流」指「字符流」。
對(duì)象封裝了對(duì)字符流讀取和寫入的實(shí)現(xiàn)細(xì)節(jié),只是提供使用接口。我們可以通過(guò)類對(duì)象來(lái)調(diào)用接口(公共成員函數(shù)),從而實(shí)現(xiàn)把數(shù)據(jù)寫入到字符流中或者從字符流中讀取數(shù)據(jù)。
載入iostream文件就自動(dòng)地創(chuàng)建了cout對(duì)象,創(chuàng)建這樣的對(duì)象會(huì)自動(dòng)創(chuàng)建緩沖區(qū),并且將cout對(duì)象和其流關(guān)聯(lián)起來(lái),同時(shí)cout對(duì)象可以使用類成員函數(shù)對(duì)流(字符流)處理。
比如:cout<<"Bjarne free"?;, 把字符串"Bjarne?free"放入到cout的緩沖區(qū)中,相當(dāng)于字符串"Bjarne?free"和cout關(guān)聯(lián)起來(lái),然后cout調(diào)用成員函數(shù)對(duì)"Bjarne?free"進(jìn)行處理。
使用ostream對(duì)象 (如cout)來(lái)處理輸出。創(chuàng)建這樣的對(duì)象將打開一個(gè)流,自動(dòng)創(chuàng)建緩沖 區(qū),并將其與流關(guān)聯(lián)起來(lái),同時(shí)使得能夠使用類成員函數(shù)。
std::cin
和std::cout
就是兩個(gè)最常見的流對(duì)象,根據(jù)上面所述,對(duì)象代表流,因此對(duì)「類對(duì)象」處理,可以認(rèn)為就是對(duì)「字符流」處理,當(dāng)然,這樣做的前提是,先要把類對(duì)象和字符流關(guān)聯(lián)起來(lái)。比如,對(duì)于cin來(lái)說(shuō),就是把cin和鍵盤的字符流關(guān)聯(lián)起來(lái),對(duì)cin處理,相當(dāng)于對(duì)鍵盤輸入的字符流處理;ifstream類類型定義的類對(duì)象就是和文件流關(guān)聯(lián)起來(lái),比如 ifstream in (file);,類對(duì)象in和文件file關(guān)聯(lián)起來(lái),對(duì)類對(duì)象in處理,相當(dāng)于對(duì)file文件流處理,通過(guò)in讀取數(shù)據(jù),相當(dāng)于對(duì)文件中的文件流讀取數(shù)據(jù)。