詳解C++編程中的輸入輸相關(guān)的類和對(duì)象
C++輸入和輸出的概念
我們經(jīng)常用到的輸入和輸出,都是以終端為對(duì)象的,即從鍵盤輸入數(shù)據(jù),運(yùn)行結(jié)果輸出到顯示器屏幕上。從操作系統(tǒng)的角度看,每一個(gè)與主機(jī)相連的輸入輸出設(shè)備都被看作一個(gè)文件。除了以終端為對(duì)象進(jìn)行輸入和輸出外,還經(jīng)常用磁盤(光盤)作為輸入輸出對(duì)象,磁盤文件既可以作為輸入文件,也可以作為輸出文件。
程序的輸入指的是從輸入文件將數(shù)據(jù)傳送給程序,程序的輸出指的是從程序?qū)?shù)據(jù)傳送給輸出文件。
C++輸入輸出包含以下三個(gè)方面的內(nèi)容:
對(duì)系統(tǒng)指定的標(biāo)準(zhǔn)設(shè)備的輸入和輸出。即從鍵盤輸入數(shù)據(jù),輸出到顯示器屏幕。這種輸入輸出稱為標(biāo)準(zhǔn)的輸入輸出,簡(jiǎn)稱標(biāo)準(zhǔn)I/O。
以外存磁盤文件為對(duì)象進(jìn)行輸入和輸出,即從磁盤文件輸入數(shù)據(jù),數(shù)據(jù)輸出到磁盤文件。以外存文件為對(duì)象的輸入輸出稱為文件的輸入輸出,簡(jiǎn)稱文件I/O。
對(duì)內(nèi)存中指定的空間進(jìn)行輸入和輸出。通常指定一個(gè)字符數(shù)組作為存儲(chǔ)空間(實(shí)際上可以利用該空間存儲(chǔ)任何信息)。這種輸入和輸出稱為字符串輸入輸出,簡(jiǎn)稱串I/O。
C++采取不同的方法來(lái)實(shí)現(xiàn)以上種輸入輸出。為了實(shí)現(xiàn)數(shù)據(jù)的有效流動(dòng),C++系統(tǒng)提供了龐大的I/O類庫(kù),調(diào)用不同的類去實(shí)現(xiàn)不同的功能。
在C語(yǔ)言中,用printf和scanf進(jìn)行輸入輸出,往往不能保證所輸入輸出的數(shù)據(jù)是可靠的安全的。在C++的輸入輸出中,編譯系統(tǒng)對(duì)數(shù)據(jù)類型進(jìn)行嚴(yán)格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過(guò)編譯。因此C++的I/O操作是類型安全(type safe)的。C++的I/O操作是可擴(kuò)展的,不僅可以用來(lái)輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)據(jù)。C++對(duì)標(biāo)準(zhǔn)類型的數(shù)據(jù)和對(duì)用戶聲明類型數(shù)據(jù)的輸入輸出,采用同樣的方法處理。C++通過(guò)I/O類庫(kù)來(lái)實(shí)現(xiàn)豐富的I/O功能。C++的輸入輸出優(yōu)于C語(yǔ)言中的printf和scanf,但是比較復(fù)雜,要掌握許多細(xì)節(jié)。
C++的I/O對(duì)C的發(fā)展--類型安全和可擴(kuò)展性
在C語(yǔ)言中,用primf和scanf進(jìn)行輸人輸出,往往不能保證所輸入輸出的數(shù)據(jù)是可靠的、安全的。學(xué)過(guò)C語(yǔ)言的讀者可以分析下面的用法,想用格式符%d輸出一個(gè)整數(shù), 但不小心用它輸出了單精度變量和字符串,會(huì)出現(xiàn)什么情況?假定所用的系統(tǒng)int型占兩個(gè)字節(jié)。
printf("%d", i); // i為整型變量,正確,輸出i的值 printf("%d", f); // f為單精度變量,輸出f變量中前兩個(gè)字節(jié)的內(nèi)容 printf("%d", "C++"); //輸出宇符串"C++"的地址
編譯系統(tǒng)認(rèn)為以上語(yǔ)句都是合法的,而不對(duì)數(shù)據(jù)類型的合法性進(jìn)行檢查,顯然所得到的結(jié)果不是人們所期望的,在用scanf 輸入時(shí),有時(shí)出現(xiàn)的問(wèn)題是很隱蔽的。如:
scanf("%d", &i); //正確,輸入一個(gè)整數(shù),賦給整型變量i scanf("%d", i); //漏寫&
假如已有聲明語(yǔ)句“int i = 1; ”,定義i為整型變量,其初值為1。編譯系統(tǒng)不認(rèn)為上面的scanf語(yǔ)句出錯(cuò),而是將輸人的值存放到地址為000001的內(nèi)存單元中,這個(gè)錯(cuò)誤可能產(chǎn)生嚴(yán)重的后果。
C++為了與C兼容,保留了用printf和scanf進(jìn)行輸出和輸人的方法,以便使過(guò)去所編寫的大量的C程序仍然可以在C ++的環(huán)境下運(yùn)行,但是希望讀者在編寫新的C ++程 序時(shí)不要用C的輸入輸出機(jī)制,而要用C++自己特有的輸人輸出方法。在C++的輸入輸出中,編譯系統(tǒng)對(duì)數(shù)據(jù)類型進(jìn)行嚴(yán)格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過(guò)編譯。因此C++的I/O操作是類型安全(type safe)的。
此外,用printf和scanf可以輸出和輸入標(biāo)準(zhǔn)類型的數(shù)據(jù)(如int、float、double、char), 但無(wú)法輸出用戶自己聲明的類型(如數(shù)組、結(jié)構(gòu)體、類)的數(shù)據(jù)。在C++中,會(huì)經(jīng)常遇到對(duì)類對(duì)象的輸人輸出,顯然無(wú)法使用printf和scanf來(lái)處理。C++的I/O操作是可擴(kuò)展 的,不僅可以用來(lái)輸人輸出標(biāo)準(zhǔn)類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)據(jù)。C++對(duì)標(biāo)準(zhǔn)類型的數(shù)據(jù)和對(duì)用戶聲明類型數(shù)據(jù)的輸人輸出,采用同樣的方法處理。顯然,在用戶聲明了一個(gè)新類后,是無(wú)法用printf和scanf 函數(shù)直接輸出和輸人這個(gè)類的對(duì)象的。
可擴(kuò)展性是C++輸人輸出的重要特點(diǎn)之一,它能提高軟件的重用性,加快軟件的開(kāi) 發(fā)過(guò)程。
C++通過(guò)I/O類庫(kù)來(lái)實(shí)現(xiàn)豐富的I/O功能。這樣使C++的輸人輸出明顯地優(yōu)于C 語(yǔ)言中的printf和scanf,但是也為之付出了代價(jià),C++的I/O系統(tǒng)變得比較復(fù)雜,要掌握許多細(xì)節(jié)。在本章中只能介紹其基本的概念和基本的操作,有些具體的細(xì)節(jié)可在日后實(shí)際深入應(yīng)用時(shí)再進(jìn)一步掌握。
與C++輸入輸出有關(guān)的類和對(duì)象
輸入和輸出是數(shù)據(jù)傳送的過(guò)程,數(shù)據(jù)如流水一樣從一處流向另一處。C++形象地將此過(guò)程稱為流(Stream)。C++的輸入輸出流是指由若干字節(jié)組成的宇節(jié)序列,這些宇節(jié)中的數(shù)據(jù)按順序從一個(gè)對(duì)象傳送到另一對(duì)象。流表示了信息從源到目的端的流動(dòng)。在輸入操作時(shí),字節(jié)流從輸入設(shè)備(如鍵盤、磁盤)流向內(nèi)存,在輸出操作時(shí),字節(jié)流從內(nèi)存流向輸出設(shè)備(如屏幕、打印機(jī)、磁盤等)。流中的內(nèi)容可以是ASCII字符、二進(jìn)制形式的數(shù)據(jù)、圖形圖像、數(shù)字音頻視頻或其他形式的信息。
實(shí)際上,在內(nèi)存中為每一個(gè)數(shù)據(jù)流開(kāi)辟一個(gè)內(nèi)存緩沖區(qū),用來(lái)存放流中的數(shù)據(jù)。當(dāng)用cout和插入運(yùn)算符“<<”向顯示器輸出數(shù)據(jù)時(shí),先將這些數(shù)據(jù)送到程序中的輸出緩沖區(qū)保存,直到緩沖區(qū)滿了或遇到endl,就將緩沖區(qū)中的全部數(shù)據(jù)送到顯示器顯示出來(lái)。在輸入時(shí),從鍵盤輸入的數(shù)據(jù)先放在鍵盤的緩沖區(qū)中,當(dāng)按回車鍵時(shí),鍵盤緩沖區(qū)中的數(shù)據(jù)輸入到程序中的輸入緩沖區(qū),形成cin流,然后用提取運(yùn)算符“ >>”從輸入緩沖區(qū)中提取數(shù)據(jù)送給程序中的有關(guān)變量??傊魇桥c內(nèi)存緩沖區(qū)相對(duì)應(yīng)的,或者說(shuō),緩沖區(qū)中的數(shù)據(jù)就是流。
在C++中,輸入輸出流被定義為類。C++的I/O庫(kù)中的類稱為流類(stream class)。 用流類定義的對(duì)象稱為流對(duì)象。
其實(shí),cout和cin并不是C++語(yǔ)言中提供的語(yǔ)句,它們是iostream類的對(duì)象,在不了解類和對(duì)象時(shí),在不致引起誤解的前提下,為敘述方便,把它們稱為cout語(yǔ)句和cin語(yǔ)句。正如C++并未提供賦值語(yǔ)句,只提供賦值表達(dá)式,在賦值表達(dá)式后面加分號(hào)就成了C++的語(yǔ)句,為方便起見(jiàn),我們習(xí)慣稱之為賦值語(yǔ)句。又如,在C語(yǔ)言中常用 printf和scanf進(jìn)行輸出和輸入,printf和scanf是C語(yǔ)言庫(kù)函數(shù)中的輸入輸出函數(shù),一般也習(xí)慣地將由printf和scanf函數(shù)構(gòu)成的語(yǔ)句稱為printf語(yǔ)句和scanf語(yǔ)句。在使用它們時(shí),對(duì)其本來(lái)的概念應(yīng)該有準(zhǔn)確的理解。
了解了類和對(duì)象后,我們對(duì)C++的輸入輸出應(yīng)當(dāng)有更深刻的認(rèn)識(shí)。
C++編譯系統(tǒng)提供了用于輸入輸出的iostream類庫(kù)。iostream這個(gè)單詞是由3個(gè)部 分組成的,即i-o-stream,意為輸入輸出流。在iostream類庫(kù)中包含許多用于輸入輸出的 類。常用的見(jiàn)表
ios是抽象基類,由它派生出istream類和ostream類,兩個(gè)類名中第1個(gè)字母i和o分別代表輸入(input)和輸出(output)。istream類支持輸入操作,ostream類支持輸出操作, iostream類支持輸入輸出操作。iostream類是從istream類和ostream類通過(guò)多重繼承而派生的類。
C++對(duì)文件的輸入輸出需要用ifstrcam和ofstream類,兩個(gè)類名中第1個(gè)字母i和o分別代表輸入和輸出,第2個(gè)字母f代表文件(file)。ifstream支持對(duì)文件的輸入操作, ofstream支持對(duì)文件的輸出操作。類ifstream繼承了類istream,類ofstream繼承了類ostream,類fstream繼承了類iostream。見(jiàn)圖
I/O類庫(kù)中還有其他一些類,但是對(duì)于一般用戶來(lái)說(shuō),以上這些已能滿足需要了。如果想深入了解類庫(kù)的內(nèi)容和使用,可參閱所用的C++系統(tǒng)的類庫(kù)手冊(cè)。
與iostream類庫(kù)有關(guān)的頭文件
iostream類庫(kù)中不同的類的聲明被放在不同的頭文件中,用戶在自己的程序中用#include命令包含了有關(guān)的頭文件就相當(dāng)于在本程序中聲明了所需要用到的類??梢該Q —種說(shuō)法:頭文件是程序與類庫(kù)的接口,iostream類庫(kù)的接口分別由不同的頭文件來(lái)實(shí)現(xiàn)。常用的有
iostream 包含了對(duì)輸入輸出流進(jìn)行操作所需的基本信息。
fstream 用于用戶管理的文件的I/O操作。
strstream 用于字符串流I/O。
stdiostream 用于混合使用C和C + +的I/O機(jī)制時(shí),例如想將C程序轉(zhuǎn)變?yōu)镃++程序。
iomanip 在使用格式化I/O時(shí)應(yīng)包含此頭文件。
在iostream頭文件中定義的流對(duì)象
在 iostream 頭文件中定義的類有 ios,istream,ostream,iostream,istream _withassign, ostream_withassign,iostream_withassign 等。
iostream.h包含了對(duì)輸入輸出流進(jìn)行操作所需的基本信息。因此大多數(shù)C++程序都包括iostream.h。在iostream.h頭文件中不僅定義了有關(guān)的類,還定義了4種流對(duì)象, 見(jiàn)表
在iostream頭文件中定義以上4個(gè)流對(duì)象用以下的形式(以cout為例):
ostream cout ( stdout);
在定義cout為ostream流類對(duì)象時(shí),把標(biāo)準(zhǔn)輸出設(shè)備stdout作為參數(shù),這樣它就與標(biāo)準(zhǔn)輸出設(shè)備(顯示器)聯(lián)系起來(lái),如果有
cout <<3;
就會(huì)在顯示器的屏幕上輸出3。
在iostream頭文件中重載運(yùn)算符
“<<”和“>>”本來(lái)在C++中是被定義為左位移運(yùn)算符和右位移運(yùn)算符的,由于在iostream頭文件中對(duì)它們進(jìn)行了重載,使它們能用作標(biāo)準(zhǔn)類型數(shù)據(jù)的輸入和輸出運(yùn)算符。所以,在用它們的程序中必須用#include命令把iostream包含到程序中。
#include <iostream>
在istream和ostream類(這兩個(gè)類都是在iostream中聲明的)中分別有一組成員函數(shù)對(duì)位移運(yùn)算符“<<”和“>>”進(jìn)行重載,以便能用它輸入或輸出各種標(biāo)準(zhǔn)數(shù)據(jù)類型的數(shù)據(jù)。對(duì)于不同的標(biāo)準(zhǔn)數(shù)據(jù)類型要分別進(jìn)行重載,如:
ostream operator << (im ); //用于向輸出流插入一個(gè)int數(shù)據(jù) ostream operator << (float ); //用于向輸出流插入一個(gè)float數(shù)據(jù) ostream operator << (char); //用于向輸出流插入一個(gè)char數(shù)據(jù) ostream operator << (char * ); //用于向輸出流插入一個(gè)字符串?dāng)?shù)據(jù)
等。如果在程序中有下面的表達(dá)式:
cout<<"C++";
實(shí)際上相當(dāng)于:
cout.operator <<("C++")
"C ++"的值是其首字節(jié)地址,是字符型指針(char * )類型,因此選擇調(diào)用上面最后一個(gè)運(yùn)算符重載函數(shù),通過(guò)重載函數(shù)的函數(shù)體,將字符串插入到cout流中,函數(shù)返回流對(duì)象cout。
在istream類中已將運(yùn)算符“>> ”重載為對(duì)以下標(biāo)準(zhǔn)類型的提取運(yùn)算符:char, signed char, unsigned char, short, unsigned short, int, unsigned int,long, unsigned long, float, double, long double, char * , signed char *, unsigned char * 等。
在ostream類中將“<<”重載為插入運(yùn)算符,其適用類型除了以上的標(biāo)準(zhǔn)類型外,還增加了一個(gè) void * 類型。
如果想將“<<”和“>>”用于自己聲明的類型的數(shù)據(jù),就不能簡(jiǎn)單地采用包含 iostream頭文件來(lái)解決,必須自己對(duì)“<<”和“>>”進(jìn)行重載。
怎樣理解運(yùn)算符“<<”和“>>”的作用呢?有一個(gè)簡(jiǎn)單而形象的方法:它們指出了數(shù)據(jù)移動(dòng)的方向,例如
>>a
箭頭方向表示把數(shù)據(jù)放人a中。而
<<a
箭頭方向表示從a中拿出數(shù)據(jù)。
上一篇:深入解析C++中派生類的構(gòu)造函數(shù)
欄 目:C語(yǔ)言
本文標(biāo)題:詳解C++編程中的輸入輸相關(guān)的類和對(duì)象
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2703.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問(wèn)題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載