欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談C++ IO流

 更新時(shí)間:2020年08月21日 09:57:42   作者:Dabelv  
這篇文章主要介紹了C++ IO流的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下

1.輸入輸出(IO)與流的概念

輸入輸出(IO)是指計(jì)算機(jī)同任何外部設(shè)備之間的數(shù)據(jù)傳遞。常見(jiàn)的輸入輸出設(shè)備有文件、鍵盤、打印機(jī)、屏幕等。數(shù)據(jù)可以按記錄(或稱數(shù)據(jù)塊)的方式傳遞,也可以 流的方式傳遞。

所謂記錄,是指有著內(nèi)部結(jié)構(gòu)的數(shù)據(jù)塊。記錄內(nèi)部除了有需要處理的實(shí)際數(shù)據(jù)之外,還可能包含附加信息,這些附加信息通常是對(duì)本記錄數(shù)據(jù)的描述。

流是一種抽象概念,它代表了數(shù)據(jù)的無(wú)結(jié)構(gòu)化傳遞。按照流的方式進(jìn)行輸入輸出,數(shù)據(jù)被當(dāng)成無(wú)結(jié)構(gòu)的字節(jié)序或字符序列。從流中取得數(shù)據(jù)的操作稱為提取操作,而向流中添加數(shù)據(jù)的操作稱為插入操作。用來(lái)進(jìn)行輸入輸出操作的流就稱為IO流。換句話說(shuō),IO流就是以流的方式進(jìn)行輸入輸出。

C++IO流,特指以流的方式進(jìn)行輸入輸出的ISO/ANSI標(biāo)準(zhǔn)C++庫(kù)的輸入輸出類庫(kù),也就是專門負(fù)責(zé)處理IO操作的一套系統(tǒng)。任何需要傳遞的數(shù)據(jù),都要經(jīng)過(guò)這套系統(tǒng)的處理。

2.數(shù)據(jù)的表示形式

IO操作的過(guò)程中,任何需要被傳遞的數(shù)據(jù),在經(jīng)過(guò)IO類庫(kù)處理前后是不同的。這樣,我們可以把數(shù)據(jù)的表示分為兩種:內(nèi)部表示和外部表示。

數(shù)據(jù)的內(nèi)部表示便于程序進(jìn)行數(shù)據(jù)處理。典型的內(nèi)部表示有:整型數(shù)的二進(jìn)制表示、浮點(diǎ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)隱藏在對(duì)流數(shù)據(jù)的解釋中。

3.IO的步驟

在IO流里,輸入輸出分為4步:格式化/解析,緩沖,編碼轉(zhuǎn)換和傳遞。

格式化/解析:在內(nèi)部數(shù)據(jù)表示(以字節(jié)為單位)與外部數(shù)據(jù)表示(以字符為單位)之間進(jìn)行雙向轉(zhuǎn)換。例如一個(gè)2字節(jié)的整數(shù)10002,就需要5個(gè)字符來(lái)表示。

緩沖:用于在格式/解析與傳遞只加緩存字符序列。對(duì)于輸出,較短的字符序列格式化之后并不馬上輸出,而是保存在緩沖區(qū)里,待累積到一定規(guī)模之后再傳遞到外部設(shè)備。相反,從外部設(shè)備讀入的大量數(shù)據(jù)也是先放在緩沖區(qū),然后逐步取出完成輸入。默認(rèn)時(shí),IO流的輸入輸出都是經(jīng)過(guò)緩沖的,也可以讓IO流工作在無(wú)緩沖模式下。

編碼轉(zhuǎn)換: 是將一種字符表達(dá)式轉(zhuǎn)換成另一種字符表達(dá)式。如果格式化產(chǎn)生的字符表達(dá)式與外部字符表達(dá)式不同(輸出時(shí)),或者外部表達(dá)式與IO流能解析的表達(dá)式不同(輸入時(shí)),就必須進(jìn)行編碼轉(zhuǎn)換。如多字節(jié)編碼與寬字符編碼之間的轉(zhuǎn)換等。多數(shù)情況下并不需要進(jìn)行編碼轉(zhuǎn)換。

傳遞:主要是與外部設(shè)備進(jìn)行通信。輸出時(shí),傳遞負(fù)責(zé)將經(jīng)過(guò)格式化、緩沖即編碼轉(zhuǎn)換后的字符序列發(fā)送到外部設(shè)備;輸入時(shí),則負(fù)責(zé)將外部設(shè)備抽取數(shù)據(jù),為其后進(jìn)行的編碼轉(zhuǎn)換、緩沖及解析提供字符序列。

4.IO流類庫(kù)的組成結(jié)構(gòu)

IO流類庫(kù)在不同平臺(tái)的具體實(shí)現(xiàn)上,可能會(huì)有所變化,但從總體設(shè)計(jì)上來(lái)看,C++流庫(kù)主要由兩個(gè)流類層次組成:

(1)以streambuf類為父類的類層次

主要完成信息通過(guò)緩沖區(qū)的交換。派生層次如下:

緩沖區(qū):是一個(gè)隊(duì)列數(shù)據(jù)結(jié)構(gòu),由一字符序列和兩個(gè)指針組成,這兩個(gè)指針?lè)謩e指向字符要被插入或被取出的位置。
streambuf類為所有的streambuf類層次對(duì)象設(shè)置了一個(gè)固定的內(nèi)存緩沖區(qū),動(dòng)態(tài)劃分為兩部分:
用做輸入的取區(qū),用取指針指示當(dāng)前取字符位置。
用做輸出的存區(qū),用存指針指示當(dāng)前存字符位置。

(2)以ios類為父類的類層次

ios類及其派生類是在streambuf類實(shí)現(xiàn)的通過(guò)緩沖區(qū)的信息交換的基礎(chǔ)上,進(jìn)一步增加了各種格式化的輸入/輸出控制方法。它們?yōu)橛脩籼峁┦褂昧黝惖慕涌冢鼈兙幸粋€(gè)指向streambuf的指針。

ios類有四個(gè)直接派生類:

  1. istream
  2. ostream
  3. fstreambase
  4. strstreambase

這四種流作為流庫(kù)中的基本流類。ios類的派生層次如下:

5. IO流類庫(kù)的優(yōu)點(diǎn)

C++語(yǔ)言開(kāi)發(fā)了自己的IO流類庫(kù),用以取代C語(yǔ)言的基本輸入輸出函數(shù)族。對(duì)于有經(jīng)驗(yàn)的C程序員來(lái)說(shuō),C語(yǔ)言提供的IO函數(shù)庫(kù)時(shí)有效且方便的。但是,C語(yǔ)言的IO函數(shù)庫(kù)有其自身的缺點(diǎn),特別是在C++這種面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中,C語(yǔ)言函數(shù)庫(kù)無(wú)法直接支持面向?qū)ο蟮某绦蛟O(shè)計(jì)。因此,C++語(yǔ)言開(kāi)發(fā)自己的IO流類庫(kù)是必然的。具體來(lái)說(shuō),IO流類庫(kù)具有以下優(yōu)點(diǎn)。

(1)簡(jiǎn)明與可讀性

IO流類庫(kù)用IO運(yùn)算符(提取運(yùn)算符>>和插入運(yùn)算符<<)代替了不同的輸入輸出函數(shù)名,如printf和scanf等。從直觀來(lái)看,這種改變使得IO語(yǔ)句更為簡(jiǎn)明。另外,也減輕了程序員在記憶函數(shù)名和書寫程序上的一些負(fù)擔(dān)。例如:

printf(“n=%d,a=%f\n”,n,a);
cout<<”n=”<<n<<”,a=”<<a<<endl;

雖然兩條語(yǔ)句的輸出結(jié)果是一樣的,但是后者更加簡(jiǎn)明,直觀,易寫,易讀。

(2)類型安全(type safe)

所謂類型安全,是指編譯器所理解的數(shù)據(jù)實(shí)體(如變量。指針?biāo)赶虻臄?shù)據(jù)等)的類型,與實(shí)際數(shù)據(jù)實(shí)體的實(shí)際類型或?qū)υ摂?shù)據(jù)所進(jìn)行的操作之間保持一致性。在進(jìn)行IO操作時(shí),編譯器將自動(dòng)檢查實(shí)參的表達(dá)式類型來(lái)調(diào)用IO流類相應(yīng)的重載版本的成員函數(shù),來(lái)完成輸入輸出。而采用C的IO函數(shù),必須顯示指明操作的數(shù)據(jù)類型,如采用printf()函數(shù),由于其參數(shù)中的數(shù)據(jù)類型必須由程序員以參數(shù)格式%d,%f,%c,%s,容易出錯(cuò)。

(3)易于擴(kuò)充

C++語(yǔ)言的IO流類庫(kù),是建立在類的繼承關(guān)系、模板和操作符重載等機(jī)制的基礎(chǔ)上的。把原來(lái)C語(yǔ)言中的左、右移位運(yùn)算符<<和>>,通過(guò)運(yùn)算符重載的方法,定 義為插入(輸出)和提取(輸入)運(yùn)算符。這就為輸入輸出功能對(duì)于各種用戶定義的類型數(shù)據(jù)的擴(kuò)充,創(chuàng)造了方便的條件。

用戶可以采用輸入輸出操作符的重載來(lái)完成用戶想要的輸入輸出功能。例如,用于復(fù)數(shù)類Complex的輸出操作符重載函數(shù)可以定義為:

friend ostream& operator<<(ostream& s,const Complex& c){
 s<<c.real<<"+"<<c.image<<"i"<<endl;
 return s;
}

輸入輸出操作符有個(gè)固定的格式,以上是一種常用的格式。由于C語(yǔ)言并不支持函數(shù)重載,也不直接支持面向?qū)ο蟮某绦蛟O(shè)計(jì),所以想擴(kuò)充C語(yǔ)言的輸入輸出函數(shù)使它們支持用戶定義的新數(shù)據(jù)類型,是一件非常困難的事情。

以上就是淺談C++ IO流的詳細(xì)內(nèi)容,更多關(guān)于C++ IO流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論