淺談C++ IO流
1.輸入輸出(IO)與流的概念
輸入輸出(IO)是指計算機(jī)同任何外部設(shè)備之間的數(shù)據(jù)傳遞。常見的輸入輸出設(shè)備有文件、鍵盤、打印機(jī)、屏幕等。數(shù)據(jù)可以按記錄(或稱數(shù)據(jù)塊)的方式傳遞,也可以 流的方式傳遞。
所謂記錄,是指有著內(nèi)部結(jié)構(gòu)的數(shù)據(jù)塊。記錄內(nèi)部除了有需要處理的實際數(shù)據(jù)之外,還可能包含附加信息,這些附加信息通常是對本記錄數(shù)據(jù)的描述。
流是一種抽象概念,它代表了數(shù)據(jù)的無結(jié)構(gòu)化傳遞。按照流的方式進(jìn)行輸入輸出,數(shù)據(jù)被當(dāng)成無結(jié)構(gòu)的字節(jié)序或字符序列。從流中取得數(shù)據(jù)的操作稱為提取操作,而向流中添加數(shù)據(jù)的操作稱為插入操作。用來進(jìn)行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進(jìn)行輸入輸出。
C++IO流,特指以流的方式進(jìn)行輸入輸出的ISO/ANSI標(biāo)準(zhǔn)C++庫的輸入輸出類庫,也就是專門負(fù)責(zé)處理IO操作的一套系統(tǒng)。任何需要傳遞的數(shù)據(jù),都要經(jīng)過這套系統(tǒng)的處理。
2.數(shù)據(jù)的表示形式
IO操作的過程中,任何需要被傳遞的數(shù)據(jù),在經(jīng)過IO類庫處理前后是不同的。這樣,我們可以把數(shù)據(jù)的表示分為兩種:內(nèi)部表示和外部表示。
數(shù)據(jù)的內(nèi)部表示便于程序進(jìn)行數(shù)據(jù)處理。典型的內(nèi)部表示有:整型數(shù)的二進(jìn)制表示、浮點數(shù)的IEEE表示、字符的ASCII或Unicode編碼表示。數(shù)據(jù)的外部表示則根據(jù)不同的外部設(shè)備的需要,有具體不同的表現(xiàn)形式。如果外部數(shù)據(jù)表示是可讀的字符序列,則稱為文本IO,否則為二進(jìn)制IO。標(biāo)準(zhǔn)IO流的主要目的是支持文本IO,不直接支持二進(jìn)制IO。
雖然IO流是以流的方式進(jìn)行數(shù)據(jù)傳遞,但這并不表明傳遞的數(shù)據(jù)不能有任何結(jié)構(gòu),而是指IO流的概念是以流的方式進(jìn)行輸入輸出,所傳遞數(shù)據(jù)的內(nèi)部結(jié)構(gòu)隱藏在對流數(shù)據(jù)的解釋中。
3.IO的步驟
在IO流里,輸入輸出分為4步:格式化/解析,緩沖,編碼轉(zhuǎn)換和傳遞。
格式化/解析:在內(nèi)部數(shù)據(jù)表示(以字節(jié)為單位)與外部數(shù)據(jù)表示(以字符為單位)之間進(jìn)行雙向轉(zhuǎn)換。例如一個2字節(jié)的整數(shù)10002,就需要5個字符來表示。
緩沖:用于在格式/解析與傳遞只加緩存字符序列。對于輸出,較短的字符序列格式化之后并不馬上輸出,而是保存在緩沖區(qū)里,待累積到一定規(guī)模之后再傳遞到外部設(shè)備。相反,從外部設(shè)備讀入的大量數(shù)據(jù)也是先放在緩沖區(qū),然后逐步取出完成輸入。默認(rèn)時,IO流的輸入輸出都是經(jīng)過緩沖的,也可以讓IO流工作在無緩沖模式下。
編碼轉(zhuǎn)換: 是將一種字符表達(dá)式轉(zhuǎn)換成另一種字符表達(dá)式。如果格式化產(chǎn)生的字符表達(dá)式與外部字符表達(dá)式不同(輸出時),或者外部表達(dá)式與IO流能解析的表達(dá)式不同(輸入時),就必須進(jìn)行編碼轉(zhuǎn)換。如多字節(jié)編碼與寬字符編碼之間的轉(zhuǎn)換等。多數(shù)情況下并不需要進(jìn)行編碼轉(zhuǎn)換。
傳遞:主要是與外部設(shè)備進(jìn)行通信。輸出時,傳遞負(fù)責(zé)將經(jīng)過格式化、緩沖即編碼轉(zhuǎn)換后的字符序列發(fā)送到外部設(shè)備;輸入時,則負(fù)責(zé)將外部設(shè)備抽取數(shù)據(jù),為其后進(jìn)行的編碼轉(zhuǎn)換、緩沖及解析提供字符序列。
4.IO流類庫的組成結(jié)構(gòu)
IO流類庫在不同平臺的具體實現(xiàn)上,可能會有所變化,但從總體設(shè)計上來看,C++流庫主要由兩個流類層次組成:
(1)以streambuf類為父類的類層次
主要完成信息通過緩沖區(qū)的交換。派生層次如下:

緩沖區(qū):是一個隊列數(shù)據(jù)結(jié)構(gòu),由一字符序列和兩個指針組成,這兩個指針分別指向字符要被插入或被取出的位置。
streambuf類為所有的streambuf類層次對象設(shè)置了一個固定的內(nèi)存緩沖區(qū),動態(tài)劃分為兩部分:
用做輸入的取區(qū),用取指針指示當(dāng)前取字符位置。
用做輸出的存區(qū),用存指針指示當(dāng)前存字符位置。
(2)以ios類為父類的類層次
ios類及其派生類是在streambuf類實現(xiàn)的通過緩沖區(qū)的信息交換的基礎(chǔ)上,進(jìn)一步增加了各種格式化的輸入/輸出控制方法。它們?yōu)橛脩籼峁┦褂昧黝惖慕涌冢鼈兙幸粋€指向streambuf的指針。
ios類有四個直接派生類:
- istream
- ostream
- fstreambase
- strstreambase
這四種流作為流庫中的基本流類。ios類的派生層次如下:

5. IO流類庫的優(yōu)點
C++語言開發(fā)了自己的IO流類庫,用以取代C語言的基本輸入輸出函數(shù)族。對于有經(jīng)驗的C程序員來說,C語言提供的IO函數(shù)庫時有效且方便的。但是,C語言的IO函數(shù)庫有其自身的缺點,特別是在C++這種面向?qū)ο蟮某绦蛟O(shè)計語言中,C語言函數(shù)庫無法直接支持面向?qū)ο蟮某绦蛟O(shè)計。因此,C++語言開發(fā)自己的IO流類庫是必然的。具體來說,IO流類庫具有以下優(yōu)點。
(1)簡明與可讀性
IO流類庫用IO運算符(提取運算符>>和插入運算符<<)代替了不同的輸入輸出函數(shù)名,如printf和scanf等。從直觀來看,這種改變使得IO語句更為簡明。另外,也減輕了程序員在記憶函數(shù)名和書寫程序上的一些負(fù)擔(dān)。例如:
printf(“n=%d,a=%f\n”,n,a); cout<<”n=”<<n<<”,a=”<<a<<endl;
雖然兩條語句的輸出結(jié)果是一樣的,但是后者更加簡明,直觀,易寫,易讀。
(2)類型安全(type safe)
所謂類型安全,是指編譯器所理解的數(shù)據(jù)實體(如變量。指針?biāo)赶虻臄?shù)據(jù)等)的類型,與實際數(shù)據(jù)實體的實際類型或?qū)υ摂?shù)據(jù)所進(jìn)行的操作之間保持一致性。在進(jìn)行IO操作時,編譯器將自動檢查實參的表達(dá)式類型來調(diào)用IO流類相應(yīng)的重載版本的成員函數(shù),來完成輸入輸出。而采用C的IO函數(shù),必須顯示指明操作的數(shù)據(jù)類型,如采用printf()函數(shù),由于其參數(shù)中的數(shù)據(jù)類型必須由程序員以參數(shù)格式%d,%f,%c,%s,容易出錯。
(3)易于擴(kuò)充
C++語言的IO流類庫,是建立在類的繼承關(guān)系、模板和操作符重載等機(jī)制的基礎(chǔ)上的。把原來C語言中的左、右移位運算符<<和>>,通過運算符重載的方法,定 義為插入(輸出)和提取(輸入)運算符。這就為輸入輸出功能對于各種用戶定義的類型數(shù)據(jù)的擴(kuò)充,創(chuàng)造了方便的條件。
用戶可以采用輸入輸出操作符的重載來完成用戶想要的輸入輸出功能。例如,用于復(fù)數(shù)類Complex的輸出操作符重載函數(shù)可以定義為:
friend ostream& operator<<(ostream& s,const Complex& c){
s<<c.real<<"+"<<c.image<<"i"<<endl;
return s;
}
輸入輸出操作符有個固定的格式,以上是一種常用的格式。由于C語言并不支持函數(shù)重載,也不直接支持面向?qū)ο蟮某绦蛟O(shè)計,所以想擴(kuò)充C語言的輸入輸出函數(shù)使它們支持用戶定義的新數(shù)據(jù)類型,是一件非常困難的事情。
以上就是淺談C++ IO流的詳細(xì)內(nèi)容,更多關(guān)于C++ IO流的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言算法練習(xí)之?dāng)?shù)組求素數(shù)
這篇文章主要為大家介紹了C語言算法練習(xí)中數(shù)組求素數(shù)的實現(xiàn)方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下2022-09-09
C++ 內(nèi)聯(lián)函數(shù)inline案例詳解
這篇文章主要介紹了C++ 內(nèi)聯(lián)函數(shù)inline案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
C/C++實現(xiàn)string和int相互轉(zhuǎn)換的常用方法總結(jié)
在C++編程中,經(jīng)常需要在字符串(string)和整型(int)之間進(jìn)行轉(zhuǎn)換,本文將詳細(xì)介紹幾種在C和C++中實現(xiàn)這兩種類型轉(zhuǎn)換的常用方法,有需要的可以參考下2024-01-01
linux c程序中獲取shell腳本輸出的實現(xiàn)方法
以下是對在linux下c程序中獲取shell腳本輸出的實現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-08-08
C++高性能服務(wù)器框架之協(xié)程調(diào)度模塊
這篇文章主要介紹了C++高性能服務(wù)器框架中的協(xié)程調(diào)度模塊,文中通過代碼示例介紹的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06
深入二叉樹兩個結(jié)點的最低共同父結(jié)點的詳解
本篇文章是對二叉樹兩個結(jié)點的最低共同父結(jié)點進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

