c++標(biāo)準(zhǔn)輸入輸出流關(guān)系的前世今生
輸入輸出是每一種編程語(yǔ)言必不可少的部分,c++也不例外,下面我們就來(lái)說(shuō)明c++的標(biāo)準(zhǔn)輸入輸出的前世今生。
1.首先說(shuō)一下iostream和iostream.h的區(qū)別
#include<iostream> // 這個(gè)就是1998年標(biāo)準(zhǔn)化以后的標(biāo)準(zhǔn)頭文件,使用時(shí)需要使用聲明命名空間std #include<iostream.h> // 這個(gè)就是標(biāo)準(zhǔn)化以前的頭文件,里面的函數(shù)以及類(lèi)都是全局的
iostream是現(xiàn)在C++中規(guī)定的標(biāo)準(zhǔn),目的在于使C++代碼用于移植和混合嵌入時(shí)不受擴(kuò)展名.h的限制,避免因?yàn)?h而造成的額外的處理和修改。
iostream包含的基本功能和對(duì)應(yīng)的iostream.h相同,iostream中定義的內(nèi)容都在命名空間std中,而iostream.h是為了對(duì)c語(yǔ)言進(jìn)行兼容,所以將標(biāo)準(zhǔn)輸入輸出功能都定義在全局空間中,他們的使用方法也是不一樣的,另外推薦直接使用iostream,畢竟iostream.h是很多年前的老物件了,標(biāo)準(zhǔn)c++中已經(jīng)明確不適用了,以后有可能被淘汰。
注意:在標(biāo)準(zhǔn)化的過(guò)程中,庫(kù)中有些部分的細(xì)節(jié)被修改了,所以舊頭文件和新頭文件中的實(shí)體不一定完全對(duì)應(yīng)
這里看一下他們使用上的不同:
#include<iostream.h> 或者是 #include<iostream> using namespace std;
可見(jiàn)凡是要使用標(biāo)準(zhǔn)c++輸入輸出,都需要加上using namespace std。
2.輸入輸出流關(guān)系梳理
要弄清楚c++的輸入輸出流,必須要從源頭找起,從安裝文件里面找出輸入輸出流相關(guān)的頭文件,大概列一下,相關(guān)頭文件有以下這些:
- istream,可以看到istream頭文件是聲明了basic_istream模板類(lèi)
- ostream,ostream頭文件是聲明了basic_ostream模板類(lèi)
- iostream,iostream只是聲明了一個(gè)istream對(duì)象和三個(gè)ostream對(duì)象,這一點(diǎn)后面會(huì)說(shuō)明
- iosfwd,iosfwd頭文件里面聲明了所有輸入輸出類(lèi)的模板類(lèi)的一個(gè)實(shí)例
- fstream,fstream里面聲明了basic_filebuf模板類(lèi)、basic_ifstream模板類(lèi)、basic_ofstream模板類(lèi)
- iomainip,iomainip里面聲明了一些帶參數(shù)的操縱算子
- sstream,sstream里面聲明了basic_stringbuf模板類(lèi)、basic_istringstream模板類(lèi)、basic_ostringstream模板類(lèi)
- streambuf,streambuf里面聲明了basic_streambuf模板類(lèi)
上面說(shuō)到iosfwd對(duì)輸入輸出的類(lèi)模板做了實(shí)例化,我們截取一段代碼,如下:
/// Base class for @c char streams. typedef basic_ios<char> ios; //基礎(chǔ)類(lèi) /// Base class for @c char buffers. typedef basic_streambuf<char> streambuf; /// Base class for @c char input streams. typedef basic_istream<char> istream; /// Base class for @c char output streams. typedef basic_ostream<char> ostream; /// Base class for @c char mixed input and output streams. typedef basic_iostream<char> iostream; /// Class for @c char memory buffers. typedef basic_stringbuf<char> stringbuf; /// Class for @c char input memory streams. typedef basic_istringstream<char> istringstream; /// Class for @c char output memory streams. typedef basic_ostringstream<char> ostringstream; /// Class for @c char mixed input and output memory streams. typedef basic_stringstream<char> stringstream; /// Class for @c char file buffers. typedef basic_filebuf<char> filebuf; /// Class for @c char input file streams. typedef basic_ifstream<char> ifstream; /// Class for @c char output file streams. typedef basic_ofstream<char> ofstream; /// Class for @c char mixed input and output file streams. typedef basic_fstream<char> fstream;
為了敘述方便,后續(xù)我們直接使用以上實(shí)例類(lèi)來(lái)代指模板類(lèi),下面用一張圖說(shuō)明這些類(lèi)之間的關(guān)系:
箭頭代表繼承的關(guān)系,然后相應(yīng)的buf后綴的類(lèi)是同一列的其他類(lèi)使用的緩沖區(qū)類(lèi)。
以istream,ostream,iostream三者為例,看一下具體的繼承關(guān)系,如下:
template<typename _CharT, typename _Traits> class basic_istream : virtual public basic_ios<_CharT, _Traits>; template<typename _CharT, typename _Traits> class basic_ostream : virtual public basic_ios<_CharT, _Traits>; template<typename _CharT, typename _Traits> class basic_iostream : public basic_istream<_CharT, _Traits>, public basic_ostream<_CharT, _Traits>;
可以看到basic_istream和basic_ostream都是虛繼承于basic_ios,basic_iostream是繼承于basic_istream和basic_ostream,注意這里繼承于basic_ios的時(shí)候之所以要用虛擬繼承,是為了防止多重繼承時(shí),多個(gè)父類(lèi)共用基類(lèi)產(chǎn)生二義性。
注:所謂二義性是指basic_iostream類(lèi)對(duì)象會(huì)產(chǎn)生兩個(gè)basic_ios對(duì)象,用了虛繼承后,就只會(huì)產(chǎn)生一個(gè)basic_ios對(duì)象,從而避免了二義性。
說(shuō)到這里,我想問(wèn)一下,有多少人最開(kāi)始接觸iostream的時(shí)候首先使用的是cin和cout呢,其實(shí)通過(guò)iostream頭文件,我們可以看到,我們常用的cin對(duì)象就是istream的一個(gè)實(shí)例,而cout則是ostream的實(shí)例,標(biāo)準(zhǔn)c++中還聲明了ostream的另外兩個(gè)實(shí)例cerr、clog。
總結(jié)
到此這篇關(guān)于c++標(biāo)準(zhǔn)輸入輸出流關(guān)系的文章就介紹到這了,更多相關(guān)c++標(biāo)準(zhǔn)輸入輸出流關(guān)系內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)Flappy Bird小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)Flappy Bird小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12C語(yǔ)言棧順序結(jié)構(gòu)實(shí)現(xiàn)代碼
一個(gè)能夠自動(dòng)擴(kuò)容的順序結(jié)構(gòu)的棧 ArrStack 實(shí)例 (GCC編譯),有需要的朋友可以參考一下2013-10-10C語(yǔ)言版學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版學(xué)生成績(jī)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++?OpenCV實(shí)現(xiàn)boxfilter方框?yàn)V波的方法詳解
box?filter的作用很簡(jiǎn)單,即對(duì)局部區(qū)域求平均,并把值賦給某個(gè)點(diǎn),一般我們賦給區(qū)域中心。本文將用C++實(shí)現(xiàn)boxfilter方框?yàn)V波,需要的可以了解一下2022-10-10C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單翻譯功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單翻譯功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Qt圖形圖像開(kāi)發(fā)之曲線圖表模塊QChart庫(kù)讀取/設(shè)置X軸的顯示區(qū)間
這篇文章主要介紹了Qt圖形圖像開(kāi)發(fā)之曲線圖表模塊QChart庫(kù)讀取/設(shè)置X軸的顯示區(qū)間,需要的朋友可以參考下2020-03-03Qt項(xiàng)目實(shí)戰(zhàn)之方塊游戲的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)簡(jiǎn)易的方塊游戲,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03