C++譚浩強課件_第十三章_第1頁
C++譚浩強課件_第十三章_第2頁
C++譚浩強課件_第十三章_第3頁
C++譚浩強課件_第十三章_第4頁
C++譚浩強課件_第十三章_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第第13章章 輸入輸出流輸入輸出流13.1 C+的輸入和輸出的輸入和輸出13.2 標準輸出流標準輸出流13.3 標準輸入流標準輸入流13.4 文件操作與文件流文件操作與文件流13.5 字符串流字符串流以前所用到的輸入和輸出,都是以終端為對象的,以前所用到的輸入和輸出,都是以終端為對象的,即從鍵盤輸入數(shù)據(jù),運行結果輸出到顯示器屏幕上。即從鍵盤輸入數(shù)據(jù),運行結果輸出到顯示器屏幕上。從操作系統(tǒng)的角度看,每一個與主機相連的輸入輸從操作系統(tǒng)的角度看,每一個與主機相連的輸入輸出設備都被看作一個文件。除了以終端為對象進行出設備都被看作一個文件。除了以終端為對象進行輸入和輸出外,還經(jīng)常用磁盤(光盤)作為輸入輸

2、輸入和輸出外,還經(jīng)常用磁盤(光盤)作為輸入輸出對象,磁盤文件既可以作為輸入文件,也可以作出對象,磁盤文件既可以作為輸入文件,也可以作為輸出文件。為輸出文件。程序的輸入指的是從輸入文件將數(shù)據(jù)傳送給程序,程序的輸入指的是從輸入文件將數(shù)據(jù)傳送給程序,程序的輸出指的是從程序將數(shù)據(jù)傳送給輸出文件。程序的輸出指的是從程序將數(shù)據(jù)傳送給輸出文件。C+的輸入與輸出包括以下的輸入與輸出包括以下3方面的內(nèi)容方面的內(nèi)容: 13.1 C+的輸入和輸出的輸入和輸出 13.1.1 輸入輸出的含義輸入輸出的含義(1) 對系統(tǒng)指定的標準設備的輸入和輸出。即從鍵對系統(tǒng)指定的標準設備的輸入和輸出。即從鍵盤輸入數(shù)據(jù),輸出到顯示器屏幕

3、。這種輸入輸出稱盤輸入數(shù)據(jù),輸出到顯示器屏幕。這種輸入輸出稱為標準的輸入輸出,簡稱標準為標準的輸入輸出,簡稱標準I/O。(2) 以外存磁盤文件為對象進行輸入和輸出,即從以外存磁盤文件為對象進行輸入和輸出,即從磁盤文件輸入數(shù)據(jù),數(shù)據(jù)輸出到磁盤文件。以外存磁盤文件輸入數(shù)據(jù),數(shù)據(jù)輸出到磁盤文件。以外存文件為對象的輸入輸出稱為文件的輸入輸出,簡稱文件為對象的輸入輸出稱為文件的輸入輸出,簡稱文件文件I/O。(3) 對內(nèi)存中指定的空間進行輸入和輸出。通常指對內(nèi)存中指定的空間進行輸入和輸出。通常指定一個字符數(shù)組作為存儲空間(實際上可以利用該定一個字符數(shù)組作為存儲空間(實際上可以利用該空間存儲任何信息)。這種

4、輸入和輸出稱為字符串空間存儲任何信息)。這種輸入和輸出稱為字符串輸入輸出,簡稱串輸入輸出,簡稱串I/O。C+采取不同的方法來實現(xiàn)以上采取不同的方法來實現(xiàn)以上3種輸入輸出。種輸入輸出。為了實現(xiàn)數(shù)據(jù)的有效流動,為了實現(xiàn)數(shù)據(jù)的有效流動,C+系統(tǒng)提供了龐大的系統(tǒng)提供了龐大的I/O類庫,調用不同的類去實現(xiàn)不同的功能。類庫,調用不同的類去實現(xiàn)不同的功能。在在C語言中,用語言中,用printf和和scanf進行輸入輸出,往往不進行輸入輸出,往往不能保證所輸入輸出的數(shù)據(jù)是可靠的、安全的。能保證所輸入輸出的數(shù)據(jù)是可靠的、安全的。在在C+的輸入輸出中,編譯系統(tǒng)對數(shù)據(jù)類型進行嚴格的輸入輸出中,編譯系統(tǒng)對數(shù)據(jù)類型進行

5、嚴格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過編譯。的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過編譯。因此因此C+的的I/O操作是類型安全(操作是類型安全(type safe)的。)的。C+的的I/O操作是可擴展的,不僅可以用來輸入輸出操作是可擴展的,不僅可以用來輸入輸出標準類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)標準類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)據(jù)。據(jù)。C+對標準類型的數(shù)據(jù)和對用戶聲明類型數(shù)據(jù)的對標準類型的數(shù)據(jù)和對用戶聲明類型數(shù)據(jù)的輸入輸出,采用同樣的方法處理。輸入輸出,采用同樣的方法處理。C+通過通過I/O類庫來實現(xiàn)豐富的類庫來實現(xiàn)豐富的I/O功能。功能。C+的輸入的輸入輸出優(yōu)于輸出優(yōu)

6、于C語言中的語言中的printf和和scanf,但是比較復雜,但是比較復雜,要掌握許多細節(jié)。要掌握許多細節(jié)。13.1.2 C+的的I/O對對C的發(fā)展的發(fā)展類型安全和類型安全和可擴展性可擴展性C+的輸入輸出流是指由若干字節(jié)組成的字節(jié)序列,的輸入輸出流是指由若干字節(jié)組成的字節(jié)序列,這些字節(jié)中的數(shù)據(jù)按順序從一個對象傳送到另一對這些字節(jié)中的數(shù)據(jù)按順序從一個對象傳送到另一對象。流表示了信息從源到目的端的流動。在輸入操象。流表示了信息從源到目的端的流動。在輸入操作時,字節(jié)流從輸入設備(如鍵盤、磁盤)流向內(nèi)作時,字節(jié)流從輸入設備(如鍵盤、磁盤)流向內(nèi)存,在輸出操作時,字節(jié)流從內(nèi)存流向輸出設備存,在輸出操作時

7、,字節(jié)流從內(nèi)存流向輸出設備(如屏幕、打印機、磁盤等)。流中的內(nèi)容可以是(如屏幕、打印機、磁盤等)。流中的內(nèi)容可以是ASCII字符、二進制形式的數(shù)據(jù)、圖形圖像、數(shù)字音字符、二進制形式的數(shù)據(jù)、圖形圖像、數(shù)字音頻視頻或其他形式的信息。頻視頻或其他形式的信息。實際上,在內(nèi)存中為每一個數(shù)據(jù)流開辟一個內(nèi)存緩實際上,在內(nèi)存中為每一個數(shù)據(jù)流開辟一個內(nèi)存緩沖區(qū),用來存放流中的數(shù)據(jù)。流是與內(nèi)存緩沖區(qū)相沖區(qū),用來存放流中的數(shù)據(jù)。流是與內(nèi)存緩沖區(qū)相對應的,或者說,緩沖區(qū)中的數(shù)據(jù)就是流。對應的,或者說,緩沖區(qū)中的數(shù)據(jù)就是流。13.1.3 C+的輸入輸出流的輸入輸出流在在C+中,輸入輸出流被定義為類。中,輸入輸出流被定義

8、為類。C+的的I/O庫中庫中的類稱為流類(的類稱為流類(stream class)。用流類定義的對象)。用流類定義的對象稱為流對象。稱為流對象。cout和和cin并不是并不是C+語言中提供的語句,它們是語言中提供的語句,它們是iostream類的對象,在未學習類和對象時,在不致引類的對象,在未學習類和對象時,在不致引起誤解的前提下,為敘述方便,把它們稱為起誤解的前提下,為敘述方便,把它們稱為cout語句語句和和cin語句。語句。在學習了類和對象后,我們對在學習了類和對象后,我們對C+的輸入輸出應當有的輸入輸出應當有更深刻的認識。更深刻的認識。1. iostream類庫中有關的類類庫中有關的類C

9、+編譯系統(tǒng)提供了用于輸入輸出的編譯系統(tǒng)提供了用于輸入輸出的iostream類庫。類庫。iostream這個單詞是由這個單詞是由3個部分組成的,即個部分組成的,即i-o-stream,意為輸入輸出流。在意為輸入輸出流。在iostream類庫中包含許多用于輸類庫中包含許多用于輸入輸出的類。常用的見書中表入輸出的類。常用的見書中表13.1。ios是抽象基類,由它派生出是抽象基類,由它派生出istream類和類和ostream類,類,兩個類名中第兩個類名中第1個字母個字母i和和o分別代表輸入(分別代表輸入(input)和)和輸出(輸出(output)。)。istream類支持輸入操作,類支持輸入操作,

10、ostream類支持輸出操作,類支持輸出操作,iostream類支持輸入輸出操作。類支持輸入輸出操作。 iostream類是從類是從istream類和類和ostream類通過多重繼承類通過多重繼承而派生的類。其繼承層次見圖而派生的類。其繼承層次見圖13.1表示。表示。圖圖13.1C+對文件的輸入輸出需要用對文件的輸入輸出需要用ifstream和和ofstream類,類,兩個類名中第兩個類名中第1個字母個字母i和和o分別代表輸入和輸出,第分別代表輸入和輸出,第2個字母個字母f代表文件(代表文件(file)。)。ifstream支持對文件的輸支持對文件的輸入操作,入操作,ofstream支持對文件

11、的輸出操作。類支持對文件的輸出操作。類ifstream繼承了類繼承了類istream,類,類ofstream繼承了類繼承了類ostream,類,類fstream繼承了類繼承了類iostream。見圖。見圖13.2。圖圖13.2I/O類庫中還有其他類,見圖類庫中還有其他類,見圖13.3。圖圖13.32. 與與iostream類庫有關的頭文件類庫有關的頭文件iostream類庫中不同的類的聲明被放在不同的頭文件類庫中不同的類的聲明被放在不同的頭文件中,用戶在自己的程序中用中,用戶在自己的程序中用#include命令包含了有關命令包含了有關的頭文件就相當于在本程序中聲明了所需要用到的的頭文件就相當于

12、在本程序中聲明了所需要用到的類。可以換一種說法類??梢該Q一種說法: 頭文件是程序與類庫的接口,頭文件是程序與類庫的接口,iostream類庫的接口分別由不同的頭文件來實現(xiàn)。常類庫的接口分別由不同的頭文件來實現(xiàn)。常用的有用的有iostream包含了對輸入輸出流進行操作所需的基本信包含了對輸入輸出流進行操作所需的基本信息。息。fstream用于用戶管理的文件的用于用戶管理的文件的I/O操作。操作。strstream用于字符串流用于字符串流I/O。stdiostream用于混合使用用于混合使用C和和C+的的I/O機制時。機制時。iomanip在使用格式化在使用格式化I/O時應包含此頭文件。時應包含此

13、頭文件。3. 在在iostream頭文件中定義的流對象頭文件中定義的流對象在在iostream頭文件中定義的類有頭文件中定義的類有ios,istream,ostream,iostream,istream _withassign, ostream_withassign,iostream_withassign等。等。iostream.h包含了對輸入輸出流進行操作所需的基本包含了對輸入輸出流進行操作所需的基本信息。因此大多數(shù)信息。因此大多數(shù)C+程序都包括程序都包括iostream.h。在。在iostream.h頭文件中不僅定義了有關的類,還定義了頭文件中不僅定義了有關的類,還定義了4種流對象,見書中

14、表種流對象,見書中表13.2。cin是是istream的派生類的派生類istream_withassign的對象的對象,它是它是從標準輸入設備(鍵盤)輸入到內(nèi)存的數(shù)據(jù)流,稱從標準輸入設備(鍵盤)輸入到內(nèi)存的數(shù)據(jù)流,稱為為cin流或標準輸入流。流或標準輸入流。cout是是ostream的派生類的派生類ostream_withassign的對象,它是從內(nèi)存輸入到標準的對象,它是從內(nèi)存輸入到標準輸出設備(顯示器)輸出設備(顯示器) 的數(shù)據(jù)流,稱為的數(shù)據(jù)流,稱為cout流或標準流或標準輸出流。輸出流。cerr和和clog作用相似,均為向輸出設備(顯示器)作用相似,均為向輸出設備(顯示器) 輸輸出出錯信

15、息。因此用鍵盤輸入時用出出錯信息。因此用鍵盤輸入時用cin流,向顯示器流,向顯示器輸出時用輸出時用cout流。向顯示器輸出出錯信息時用流。向顯示器輸出出錯信息時用cerr和和clog流。流。在在iostream頭文件中定義以上頭文件中定義以上4個流對象用以下的形個流對象用以下的形式(以式(以cout為例)為例): ostream cout (stdout);在定義在定義cout為為ostream流類對象時,把標準輸出設備流類對象時,把標準輸出設備stdout作為參數(shù),這樣它就與標準輸出設備(顯示器)作為參數(shù),這樣它就與標準輸出設備(顯示器)聯(lián)系起來,如果有聯(lián)系起來,如果有cout3;就會在顯示

16、器的屏幕上輸出就會在顯示器的屏幕上輸出3。4. 在在iostream頭文件中重載運算符頭文件中重載運算符“”本來在本來在C+中是被定義為左位移運算符中是被定義為左位移運算符和右位移運算符的,由于在和右位移運算符的,由于在iostream頭文件中對它們頭文件中對它們進行了重載,使它們能用作標準類型數(shù)據(jù)的輸入和進行了重載,使它們能用作標準類型數(shù)據(jù)的輸入和輸出運算符。所以,在用它們的程序中必須用輸出運算符。所以,在用它們的程序中必須用#include命令把命令把iostream包含到程序中。包含到程序中。#include 在在istream和和ostream類(這兩個類都是在類(這兩個類都是在ios

17、tream中中聲明的)中分別有一組成員函數(shù)對位移運算符聲明的)中分別有一組成員函數(shù)對位移運算符“”進行重載,以便能用它輸入或輸出各種標準進行重載,以便能用它輸入或輸出各種標準數(shù)據(jù)類型的數(shù)據(jù)。對于不同的標準數(shù)據(jù)類型要分別數(shù)據(jù)類型的數(shù)據(jù)。對于不同的標準數(shù)據(jù)類型要分別進行重載,如進行重載,如ostream operator (int );/用于向輸出流插入一個用于向輸出流插入一個int數(shù)據(jù)數(shù)據(jù)ostream operator (float ); /用于向輸出流插入一個用于向輸出流插入一個float數(shù)據(jù)數(shù)據(jù)ostream operator (char ); /用于向輸出流插入一個用于向輸出流插入一個c

18、har數(shù)據(jù)數(shù)據(jù)ostream operator (char *); /用于向輸出流插入一個字符串數(shù)據(jù)等。用于向輸出流插入一個字符串數(shù)據(jù)等。如果在程序中有下面的表達式如果在程序中有下面的表達式: coutC+;根據(jù)第根據(jù)第11章所介紹的知識,上面的表達式相當于章所介紹的知識,上面的表達式相當于cout.operator”重載為對以下標準類重載為對以下標準類型的提取運算符型的提取運算符: char,signed char,unsigned char,short,unsigned short,int,unsigned int,long,unsigned long,float, double,long

19、 double, char*,signed char*,unsigned char*等。等。 在在ostream類中將類中將“”重載為插入運算符,其適用類重載為插入運算符,其適用類型除了以上的標準類型外,還增加了一個型除了以上的標準類型外,還增加了一個void*類型。類型。如果想將如果想將“”用于自己聲明的類型的數(shù)據(jù),用于自己聲明的類型的數(shù)據(jù),就不能簡單地采用包含就不能簡單地采用包含iostream頭文件來解決,必須頭文件來解決,必須自己用第自己用第11章的方法對章的方法對“”進行重載。進行重載。怎樣理解運算符怎樣理解運算符“”的作用呢?它們指出了的作用呢?它們指出了數(shù)據(jù)移動的方向,例如數(shù)據(jù)移

20、動的方向,例如a箭頭方向表示把數(shù)據(jù)放入箭頭方向表示把數(shù)據(jù)放入a中。而中。而a箭頭方向表示從箭頭方向表示從a中拿出數(shù)據(jù)。中拿出數(shù)據(jù)。+標準輸出流是流向標準輸出設備(顯示器)的數(shù)據(jù)。標準輸出流是流向標準輸出設備(顯示器)的數(shù)據(jù)。13.2 標準輸出流標準輸出流ostream類定義了類定義了3個輸出流對象,即個輸出流對象,即cout,cerr,clog。分述如下。分述如下。1. cout流對象流對象cout是是console output的縮寫,意為在控制臺(終端的縮寫,意為在控制臺(終端顯示器)的輸出。顯示器)的輸出。(1) cout不是不是C+預定義的關鍵字,它是預定義的關鍵字,它是ostream

21、流流類的對象,在類的對象,在iostream中定義。中定義。(2) 用用“cout”輸出基本類型的數(shù)據(jù)時,可以不必輸出基本類型的數(shù)據(jù)時,可以不必考慮數(shù)據(jù)是什么類型,系統(tǒng)會判斷數(shù)據(jù)的類型,并考慮數(shù)據(jù)是什么類型,系統(tǒng)會判斷數(shù)據(jù)的類型,并根據(jù)其類型選擇調用與之匹配的運算符重載函數(shù)。根據(jù)其類型選擇調用與之匹配的運算符重載函數(shù)。13.2.1 cout,cerr和和clog流流(3) cout流在內(nèi)存中對應開辟了一個緩沖區(qū),用來流在內(nèi)存中對應開辟了一個緩沖區(qū),用來存放流中的數(shù)據(jù),當向存放流中的數(shù)據(jù),當向cout流插入一個流插入一個endl時,不論時,不論緩沖區(qū)是否已滿,都立即輸出流中所有數(shù)據(jù),然后緩沖區(qū)是

22、否已滿,都立即輸出流中所有數(shù)據(jù),然后插入一個換行符,并刷新流(清空緩沖區(qū))。插入一個換行符,并刷新流(清空緩沖區(qū))。(4) 在在iostream中只對中只對“”運算符用于標準運算符用于標準類型數(shù)據(jù)的輸入輸出進行了重載,但未對用戶聲明類型數(shù)據(jù)的輸入輸出進行了重載,但未對用戶聲明的類型數(shù)據(jù)的輸入輸出進行重載。的類型數(shù)據(jù)的輸入輸出進行重載。2. cerr流對象流對象cerr流對象是標準錯誤流。流對象是標準錯誤流。cerr流已被指定為與顯示流已被指定為與顯示器關聯(lián)。器關聯(lián)。cerr的作用是向標準錯誤設備(的作用是向標準錯誤設備(standard error device)輸出有關出錯信息。)輸出有關出

23、錯信息。cerr與標準輸出流與標準輸出流cout的作用和用法差不多。但有一點不同的作用和用法差不多。但有一點不同: cout流通流通常是傳送到顯示器輸出,但也可以被重定向輸出到常是傳送到顯示器輸出,但也可以被重定向輸出到磁盤文件,而磁盤文件,而cerr流中的信息只能在顯示器輸出。當流中的信息只能在顯示器輸出。當調試程序時,往往不希望程序運行時的出錯信息被調試程序時,往往不希望程序運行時的出錯信息被送到其他文件,而要求在顯示器上及時輸出,這時送到其他文件,而要求在顯示器上及時輸出,這時應該用應該用cerr。cerr流中的信息是用戶根據(jù)需要指定的。流中的信息是用戶根據(jù)需要指定的。例例13.1 有一

24、元二次方程有一元二次方程ax2+bx+c=0,其一般解為,其一般解為x1,2=(-bb2-4ac)/2a,但若但若a=0,或,或b2-4ac0時,用時,用此公式出錯。此公式出錯。編程序,從鍵盤輸入編程序,從鍵盤輸入a,b,c的值,求的值,求x1和和x2。如果。如果a=0或或b2-4ac0,輸出出錯信息。,輸出出錯信息。#include #include using namespace std;int main( )float a,b,c,disc; coutabc; if (a=0)cerra is equal to zero,error!endl; /將有關出錯信息插入將有關出錯信息插入ce

25、rr流,在屏幕輸出流,在屏幕輸出 elseif (disc=b*b-4*a*c)0)cerrdisc=b*b-4*a*c0endl; /將有關出錯信息插入將有關出錯信息插入cerr流,在屏幕輸出流,在屏幕輸出elsecoutx1=(-b+sqrt(disc)/(2*a)endl; coutx2=(-b-sqrt(disc)/(2*a)endl; return 0;運行情況如下運行情況如下:please input a,b,c: 0 2 3 a is equal to zero,error! please input a,b,c: 5 2 3 sc=b*b-4*a*c0please input

26、a,b,c: 1 2.5 1.5 x1=-1x2=-1.53. clog流對象流對象clog流對象也是標準錯誤流,它是流對象也是標準錯誤流,它是console log的縮寫。的縮寫。它的作用和它的作用和cerr相同,都是在終端顯示器上顯示出錯相同,都是在終端顯示器上顯示出錯信息。區(qū)別信息。區(qū)別: cerr是不經(jīng)過緩沖區(qū),直接向顯示器上是不經(jīng)過緩沖區(qū),直接向顯示器上輸出有關信息,而輸出有關信息,而clog中的信息存放在緩沖區(qū)中,緩中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或遇沖區(qū)滿后或遇endl時向顯示器輸出。時向顯示器輸出。在輸出數(shù)據(jù)時,有時希望數(shù)據(jù)按指定的格式輸出。在輸出數(shù)據(jù)時,有時希望數(shù)據(jù)按指定的

27、格式輸出。有兩種方法可以達到此目的。一種是第有兩種方法可以達到此目的。一種是第3章已介紹過章已介紹過的使用控制符的方法;第的使用控制符的方法;第2種是使用流對象的有關成種是使用流對象的有關成員函數(shù)。員函數(shù)。1. 使用控制符控制輸出格式使用控制符控制輸出格式輸出數(shù)據(jù)的控制符見書中表輸出數(shù)據(jù)的控制符見書中表13.3。應當注意,這些控制符是在頭文件應當注意,這些控制符是在頭文件iomanip中定義的,中定義的,因而程序中應當包含因而程序中應當包含iomanip。13.2.2 格式輸出格式輸出例例13.2 用控制符控制輸出格式。用控制符控制輸出格式。#include #include /不要忘記包含此

28、頭文件不要忘記包含此頭文件using namespace std;int main()()int a; couta; coutdec:decaendl; /以十進制形式輸出整數(shù)以十進制形式輸出整數(shù) couthex:hexaendl; /以十六進制形式輸出整數(shù)以十六進制形式輸出整數(shù)a coutoct:setbase(8)aendl; /以八進制形式輸出整數(shù)以八進制形式輸出整數(shù)a char *pt=China; /pt指向字符串指向字符串China coutsetw(10)ptendl; /指定域寬為指定域寬為10,輸出字符串,輸出字符串coutsetfill(*)setw(10)ptendl;

29、/指定域寬指定域寬10,輸出字符串,空白處以,輸出字符串,空白處以*填充填充 double pi=22.0/7.0; /計算計算pi值值 coutsetiosflags(ios:scientific)setprecision(8);/按指數(shù)形式輸出,按指數(shù)形式輸出,8位小數(shù)位小數(shù) coutpi=piendl; /輸出輸出pi值值 coutpi=setprecision(4)piendl; /改為改為4位小數(shù)位小數(shù) coutpi=setiosflags(ios:fixed)piendl;/改為小數(shù)形式輸出改為小數(shù)形式輸出 return 0;運行結果如下運行結果如下:input a:34 (輸入(

30、輸入a的值)的值)dec:34 (十進制形式)(十進制形式)hex:22 (十六進制形式)(十六進制形式)oct:42 (八進制形式)(八進制形式) China (域寬為(域寬為10)*China (域寬為(域寬為10,空白處以,空白處以*填充)填充)pi=3.14285714e+00 (指數(shù)形式輸出,(指數(shù)形式輸出,8位小數(shù))位小數(shù))pi=3.1429e+00 (指數(shù)形式輸出,(指數(shù)形式輸出,4位小數(shù))位小數(shù))pi=3.143 (小數(shù)形式輸出,精度仍為(小數(shù)形式輸出,精度仍為4)2. 用流對象的成員函數(shù)控制輸出格式用流對象的成員函數(shù)控制輸出格式除了可以用控制符來控制輸出格式外,還可以通過除了

31、可以用控制符來控制輸出格式外,還可以通過調用流對象調用流對象cout中用于控制輸出格式的成員函數(shù)來控中用于控制輸出格式的成員函數(shù)來控制輸出格式。用于控制輸出格式的常用的成員函數(shù)制輸出格式。用于控制輸出格式的常用的成員函數(shù)見書中表見書中表13.4。流成員函數(shù)流成員函數(shù)setf和控制符和控制符setiosflags括號中的參數(shù)表示括號中的參數(shù)表示格式狀態(tài),它是通過格式標志來指定的。格式標志格式狀態(tài),它是通過格式標志來指定的。格式標志在類在類ios中被定義為枚舉值。因此在引用這些格式標中被定義為枚舉值。因此在引用這些格式標志時要在前面加上類名志時要在前面加上類名ios和域運算符和域運算符“:”。格式

32、標志。格式標志見書中表見書中表13.5。例例13.3 用流控制成員函數(shù)輸出數(shù)據(jù)。用流控制成員函數(shù)輸出數(shù)據(jù)。#include using namespace std;int main( )int a=21 cout.setf(ios:showbase);/顯示基數(shù)符號(顯示基數(shù)符號(0 x或或0) coutdec:aendl; /默認以十進制形式輸出默認以十進制形式輸出a cout.unsetf(ios:dec); /終止十進制的格式設置終止十進制的格式設置 cout.setf(ios:hex); /設置以十六進制輸出的狀態(tài)設置以十六進制輸出的狀態(tài) couthex:aendl; /以十六進制形式

33、輸出以十六進制形式輸出acout.unsetf(ios:hex); /終止十六進制的格式設置終止十六進制的格式設置 cout.setf(ios:oct); /設置以八進制輸出的狀態(tài)設置以八進制輸出的狀態(tài) coutoct:aendl; /以八進制形式輸出以八進制形式輸出acout.unseft(ios:oct); char *pt=China; /pt指向字符串指向字符串China cout.width(10); /指定域寬為指定域寬為10 coutptendl; /輸出字符串輸出字符串 cout.width(10); /指定域寬為指定域寬為10 cout.fill(*); /指定空白處以指定空

34、白處以*填充填充 coutptendl; /輸出字符串輸出字符串 double pi=22.0/7.0; /輸出輸出pi值值cout.setf(ios:scientific); /指定用科學記數(shù)法輸出指定用科學記數(shù)法輸出coutpi=; /輸出輸出pi=cout.width(14); /指定域寬為指定域寬為14coutpiendl; /輸出輸出pi值值cout.unsetf(ios:scientific); /終止科學記數(shù)法狀態(tài)終止科學記數(shù)法狀態(tài)cout.setf(ios:fixed); /指定用定點形式輸出指定用定點形式輸出cout.width(12); /指定域寬為指定域寬為12cout.

35、setf(ios:showpos); /正數(shù)輸出正數(shù)輸出“+”號號cout.setf(ios:internal); /數(shù)符出現(xiàn)在左側數(shù)符出現(xiàn)在左側cout.precision(6); /保留保留6位小數(shù)位小數(shù)coutpiendl; /輸出輸出pi,注意數(shù)符,注意數(shù)符“+”的位置的位置return 0;運行情況如下運行情況如下: dec:21(十進制形式)(十進制形式)hex:0 x15 (十六進制形式,以(十六進制形式,以0 x開頭)開頭)oct:025 (八進制形式,以(八進制形式,以0開頭)開頭) China (域寬為(域寬為10)*China (域寬為(域寬為10,空白處以,空白處以*填

36、充)填充)pi=*3.142857e+00 (指數(shù)形式輸出,域寬(指數(shù)形式輸出,域寬14,默認,默認6位小數(shù))位小數(shù))+*3.142857 (小數(shù)形式輸出,精度為(小數(shù)形式輸出,精度為6,最左側輸出數(shù)符,最左側輸出數(shù)符“+”)ostream類除了提供上面介紹過的用于格式控制的成類除了提供上面介紹過的用于格式控制的成員函數(shù)外,還提供了專用于輸出單個字符的成員函員函數(shù)外,還提供了專用于輸出單個字符的成員函數(shù)數(shù)put。如。如cout.put(a);調用該函數(shù)的結果是在屏幕上顯示一個字符調用該函數(shù)的結果是在屏幕上顯示一個字符a。put函函數(shù)的參數(shù)可以是字符或字符的數(shù)的參數(shù)可以是字符或字符的ASCII代

37、碼(也可以是代碼(也可以是一個整型表達式)。如一個整型表達式)。如cout.put(65+32););也顯示字符也顯示字符a,因為,因為97是字符是字符a的的ASCII代碼。代碼??梢栽谝粋€語句中連續(xù)調用可以在一個語句中連續(xù)調用put函數(shù)。如函數(shù)。如cout.put(71).put(79).pu(79).put(68).put(n);在屏幕上顯示在屏幕上顯示GOOD。13.2.3 用流成員函數(shù)用流成員函數(shù)put輸出字符輸出字符例例13.4 有一個字符串有一個字符串BASIC,要求把它們按相反,要求把它們按相反的順序輸出。的順序輸出。#include using namespace std;in

38、t main( )char *a=BASIC;/字符指針指向字符指針指向B for(int i=4;i=0;i-) cout.put(*(a+i); /從最后一個字符開始輸出從最后一個字符開始輸出 cout.put(n); return 0;運行時在屏幕上輸出運行時在屏幕上輸出: CISAB還可以用還可以用putchar函數(shù)輸出一個字符。函數(shù)輸出一個字符。putchar函數(shù)是函數(shù)是C語言中使用的,在語言中使用的,在stdio.h頭文件中定義。頭文件中定義。C+保留保留了這個函數(shù),在了這個函數(shù),在iostream頭文件中定義。頭文件中定義。例例13.4也可以改用也可以改用putchar函數(shù)實現(xiàn)。

39、函數(shù)實現(xiàn)。#include /也可以用也可以用#include ,同時不要下一行,同時不要下一行using namespace std;int main( )char *a=BASIC; for(int i=4;i=0;i-) putchar(*(a+i); putchar(n);運行結果與前相同。運行結果與前相同。成員函數(shù)成員函數(shù)put不僅可以用不僅可以用cout流對象來調用,而且也流對象來調用,而且也可以用可以用ostream類的其他流對象調用。類的其他流對象調用。標準輸入流是從標準輸入設備(鍵盤)流向程序的標準輸入流是從標準輸入設備(鍵盤)流向程序的數(shù)據(jù)。數(shù)據(jù)。13.3 標準輸入流標準輸

40、入流在上一節(jié)中已知,在頭文件在上一節(jié)中已知,在頭文件iostream.h中定義了中定義了cin,cout,cerr,clog 4個流對象,個流對象,cin是輸入流,是輸入流,cout,cerr,clog是輸出流。是輸出流。cin是是istream類的對象,它從標準輸入設備(鍵盤)類的對象,它從標準輸入設備(鍵盤)獲取數(shù)據(jù),程序中的變量通過流提取符獲取數(shù)據(jù),程序中的變量通過流提取符“”從流中從流中提取數(shù)據(jù)。流提取符提取數(shù)據(jù)。流提取符“”從流中提取數(shù)據(jù)時通常跳從流中提取數(shù)據(jù)時通常跳過輸入流中的空格、過輸入流中的空格、tab鍵、換行符等空白字符。鍵、換行符等空白字符。 注注意意: 只有在輸入完數(shù)據(jù)再

41、按回車鍵后,該行數(shù)據(jù)才被只有在輸入完數(shù)據(jù)再按回車鍵后,該行數(shù)據(jù)才被送入鍵盤緩沖區(qū),形成輸入流,提取運算符送入鍵盤緩沖區(qū),形成輸入流,提取運算符“”才才能從中提取數(shù)據(jù)。需要注意保證從流中讀取數(shù)據(jù)能能從中提取數(shù)據(jù)。需要注意保證從流中讀取數(shù)據(jù)能正常進行。正常進行。13.3.1 cin流流例例13.5 通過測試通過測試cin的真值,判斷流對象是否處于正的真值,判斷流對象是否處于正常狀態(tài)。常狀態(tài)。#include using namespace std;int main( )float grade; coutgrade)/能從能從cin流讀取數(shù)據(jù)流讀取數(shù)據(jù)if(grade=85) coutgradeGO

42、OD!endl;if(grade60) coutgradefail!endl;coutenter grade:; coutThe end.endl; return 0;運行情況如下運行情況如下: enter grade: 67 enter grade: 89 89 GOOD!enter grade: 56 56 fail!enter grade: 100 100 GOOD!enter grade: Z /鍵入文件結束符鍵入文件結束符The end.如果某次輸入的數(shù)據(jù)為如果某次輸入的數(shù)據(jù)為enter grade: 100/2 輸出輸出The end.。在不同的在不同的C+系統(tǒng)下運行此程序,在最后

43、的處理上有系統(tǒng)下運行此程序,在最后的處理上有些不同。以上是在些不同。以上是在GCC環(huán)境下運行程序的結果,如環(huán)境下運行程序的結果,如果在果在VC+環(huán)境下運行此程序,在鍵入環(huán)境下運行此程序,在鍵入Ctrl+Z時,程時,程序運行馬上結束,不輸出序運行馬上結束,不輸出The end.。除了可以用除了可以用cin輸入標準類型的數(shù)據(jù)外,還可以用輸入標準類型的數(shù)據(jù)外,還可以用istream類流對象的一些成員函數(shù),實現(xiàn)字符的輸入。類流對象的一些成員函數(shù),實現(xiàn)字符的輸入。1. 用用get函數(shù)讀入一個字符函數(shù)讀入一個字符流成員函數(shù)流成員函數(shù)get有有3種形式種形式: 無參數(shù)的,有一個參數(shù)的,無參數(shù)的,有一個參數(shù)的

44、,有有3個參數(shù)的。個參數(shù)的。(1) 不帶參數(shù)的不帶參數(shù)的get函數(shù)函數(shù)其調用形式為其調用形式為cin.get()()用來從指定的輸入流中提取一個字符,函數(shù)的返回用來從指定的輸入流中提取一個字符,函數(shù)的返回值就是讀入的字符。若遇到輸入流中的文件結束符,值就是讀入的字符。若遇到輸入流中的文件結束符,則函數(shù)值返回文件結束標志則函數(shù)值返回文件結束標志EOF(End Of File) 。13.3.2 用于字符輸入的流成員函數(shù)用于字符輸入的流成員函數(shù)例例13.6 用用get函數(shù)讀入字符。函數(shù)讀入字符。#include int main( )int c; coutenter a sentence:endl;

45、 while(c=cin.get()()!=EOF) cout.put(c); return 0;運行情況如下運行情況如下: enter a sentence:I study C+ very hard. (輸入一行字符)(輸入一行字符)I study C+ very hard. (輸出該行字符)(輸出該行字符)Z (程序結束)(程序結束)C語言中的語言中的getchar函數(shù)與流成員函數(shù)函數(shù)與流成員函數(shù)cin.get( )的)的功能相同,功能相同,C+保留了保留了C的這種用法。的這種用法。(2) 有一個參數(shù)的有一個參數(shù)的get函數(shù)函數(shù)其調用形式為其調用形式為cin.get(ch)其作用是從輸入流

46、中讀取一個字符,賦給字符變量其作用是從輸入流中讀取一個字符,賦給字符變量ch。如果讀取成功則函數(shù)返回非。如果讀取成功則函數(shù)返回非0值(真),如失敗值(真),如失敗(遇文件結束符)(遇文件結束符) 則函數(shù)返回則函數(shù)返回0值(假)。例值(假)。例13.6可可以改寫如下以改寫如下: #include int main( )char c; coutenter a sentence:endl; while(cin.get(c) /讀取一個字符賦給字符變量讀取一個字符賦給字符變量c,如果讀取成功,如果讀取成功,cin.get(c)為真為真cout.put(c); coutendendl; return 0

47、;(3) 有有3個參數(shù)的個參數(shù)的get函數(shù)函數(shù)其調用形式為其調用形式為cin.get(字符數(shù)組,字符個數(shù)(字符數(shù)組,字符個數(shù)n,終止字符),終止字符)或或cin.get(字符指針,字符個數(shù)(字符指針,字符個數(shù)n,終止字符),終止字符)其作用是從輸入流中讀取其作用是從輸入流中讀取n-1個字符,賦給指定的字個字符,賦給指定的字符數(shù)組(或字符指針指向的數(shù)組),如果在讀取符數(shù)組(或字符指針指向的數(shù)組),如果在讀取n-1個字符之前遇到指定的終止字符,則提前結束讀取。個字符之前遇到指定的終止字符,則提前結束讀取。如果讀取成功則函數(shù)返回非如果讀取成功則函數(shù)返回非0值(真),如失?。ㄓ鲋担ㄕ妫缡。ㄓ鑫募?/p>

48、結束符)文件結束符) 則函數(shù)返回則函數(shù)返回0值(假)。再將例值(假)。再將例13.6改改寫如下寫如下: #include using namespace std;int main( )char ch20; coutenter a sentence:endl; cin.get(ch,10,n);/指定換行符為終止字符指定換行符為終止字符 coutchendl; return 0; 運行情況如下運行情況如下: enter a sentence:I study C+ very hard. I study get函數(shù)中第函數(shù)中第3個參數(shù)可以省寫,此時默認為個參數(shù)可以省寫,此時默認為n。下。下面兩行等價

49、面兩行等價: cin.get(ch,10,n);cin.get(ch,10);終止字符也可以用其他字符。如終止字符也可以用其他字符。如cin.get(ch,10,x);2. 用成員函數(shù)用成員函數(shù)getline函數(shù)讀入一行字符函數(shù)讀入一行字符getline函數(shù)的作用是從輸入流中讀取一行字符,其用函數(shù)的作用是從輸入流中讀取一行字符,其用法與帶法與帶3個參數(shù)的個參數(shù)的get函數(shù)類似。即函數(shù)類似。即cin.getline(字符數(shù)組(或字符指針),字符個數(shù)(字符數(shù)組(或字符指針),字符個數(shù)n,終止標志字符),終止標志字符)例例13.7 用用getline函數(shù)讀入一行字符。函數(shù)讀入一行字符。#includ

50、e using namespace std;int main( )char ch20; coutenter a sentence:ch; coutThe string read with cin is:chendl; cin.getline(ch,20,/);/讀讀19個字符或遇個字符或遇/結束結束 coutThe second part is:chendl; cin.getline(ch,20); /讀讀19個字符或遇個字符或遇/n結束結束 coutThe third part is:chendl; return 0;程序運行情況如下程序運行情況如下:enter a sentence: I

51、like C+./I study C+./I am happy. The string read with cin is:IThe second part is: like C+.The third part is:I study C+./I am h除了以上介紹的用于讀取數(shù)據(jù)的成員函數(shù)外,除了以上介紹的用于讀取數(shù)據(jù)的成員函數(shù)外,istream類還有其他在輸入數(shù)據(jù)時用得著的一些成員類還有其他在輸入數(shù)據(jù)時用得著的一些成員函數(shù)。常用的有以下幾種函數(shù)。常用的有以下幾種: 1. eof 函數(shù)函數(shù)eof是是end of file的縮寫,表示的縮寫,表示“文件結束文件結束”。從輸入流。從輸入流讀取數(shù)據(jù),如

52、果到達文件末尾(遇文件結束符),讀取數(shù)據(jù),如果到達文件末尾(遇文件結束符),eof函數(shù)值為非零值(表示真),否則為函數(shù)值為非零值(表示真),否則為0(假)。(假)。13.3.3 istream類的其他成員函數(shù)類的其他成員函數(shù)例例13.8 逐個讀入一行字符,將其中的非空格字符輸逐個讀入一行字符,將其中的非空格字符輸出。出。#include using namespace std;int main( )char c; while(!cin.eof( )/eof( )為假表示未遇到文件結束符)為假表示未遇到文件結束符if(c=cin.get( )!= ) /檢查讀入的字符是否為空格字符檢查讀入的字符

53、是否為空格字符 cout.put(c); return 0;運行情況如下運行情況如下:C+ is very interesting. C+isveryinteresting.Z(結束)(結束)2. peek函數(shù)函數(shù)peek是是“觀察觀察”的意思,的意思,peek函數(shù)的作用是觀測下一函數(shù)的作用是觀測下一個字符。其調用形式為個字符。其調用形式為c=cin.peek( );cin.peek函數(shù)的返回值是指針指向的當前字符,但它只是觀函數(shù)的返回值是指針指向的當前字符,但它只是觀測,指針仍停留在當前位置,并不后移。如果要訪測,指針仍停留在當前位置,并不后移。如果要訪問的字符是文件結束符,則函數(shù)值是問的字

54、符是文件結束符,則函數(shù)值是EOF(-1)。)。3. putback函數(shù)函數(shù)其調用形式為其調用形式為cin.putback(ch);其作用是將前面用其作用是將前面用get或或getline函數(shù)從輸入流中讀取函數(shù)從輸入流中讀取的字符的字符ch返回到輸入流,插入到當前指針位置,以返回到輸入流,插入到當前指針位置,以供后面讀取。供后面讀取。例例13.9 peek函數(shù)和函數(shù)和putback函數(shù)的用法。函數(shù)的用法。#include using namespace std;int main( )char c20; int ch; coutplease enter a sentence:endl; cin.g

55、etline(c,15,/); coutThe first part is:cendl; ch=cin.peek( );/觀看當前字符觀看當前字符 coutThe next character(ASCII code) is:chendl; cin.putback(c0); /將將I插入到指針所指處插入到指針所指處 cin.getline(c,15,/); coutThe second part is:cendl; return 0;運行情況如下運行情況如下:please enter a sentence: I am a boy./ am a student./ The first part i

56、s:I am a boy.The next character(ASCII code) is:32(下一個字符是空格)(下一個字符是空格)The second part is:I am a student 圖圖13.44. ignore函數(shù)函數(shù)其調用形式為其調用形式為cin,ignore(n, 終止字符)終止字符)函數(shù)作用是跳過輸入流中函數(shù)作用是跳過輸入流中n個字符,或在遇到指定的個字符,或在遇到指定的終止字符時提前結束(此時跳過包括終止字符在內(nèi)終止字符時提前結束(此時跳過包括終止字符在內(nèi)的若干字符)。如的若干字符)。如ighore(5, A)/跳過輸入流中跳過輸入流中5個字符,遇個字符,遇A

57、后就不再跳了后就不再跳了也可以不帶參數(shù)或只帶一個參數(shù)。如也可以不帶參數(shù)或只帶一個參數(shù)。如ignore( )()(n默認值為默認值為1,終止字符默認為,終止字符默認為EOF)相當于相當于ignore(1,EOF)例例13.10用用ignore函數(shù)跳過輸入流中的字符。函數(shù)跳過輸入流中的字符。先看不用先看不用ignore函數(shù)的情況函數(shù)的情況:#include using namespace std;int main( )char ch20; cin.get(ch,20,/); coutThe first part is:chendl;cin.get(ch,20,/); coutThe second

58、part is:chendl;return 0;運行結果如下運行結果如下:I like C+./I study C+./I am happy. The first part is:I like C+.The second part is:(字符數(shù)組(字符數(shù)組ch中沒有從輸入流中讀取有效字符)中沒有從輸入流中讀取有效字符)如果希望第二個如果希望第二個cin.get函數(shù)能讀取函數(shù)能讀取I study C+.,就應該設法跳過輸入流中第一個就應該設法跳過輸入流中第一個/,可以用,可以用ignore函函數(shù)來實現(xiàn)此目的,將程序改為數(shù)來實現(xiàn)此目的,將程序改為#include using namespace

59、std;int main( )char ch20; cin.get(ch,20,/); coutThe first part is:chendl; cin.ignore( );/跳過輸入流中一個字符跳過輸入流中一個字符 cin.get(ch,20,/); coutThe second part is:chendl; return 0;運行結果如下運行結果如下:I like C+./I study C+./I am happy. The first part is:I like C+.The second part is:I study C+.以上介紹的各個成員函數(shù),不僅可以用以上介紹的各個成員

60、函數(shù),不僅可以用cin流對象來流對象來調用,而且也可以用調用,而且也可以用istream類的其他流對象調用。類的其他流對象調用。迄今為止,我們討論的輸入輸出是以系統(tǒng)指定的標迄今為止,我們討論的輸入輸出是以系統(tǒng)指定的標準設備(輸入設備為鍵盤,輸出設備為顯示器)為準設備(輸入設備為鍵盤,輸出設備為顯示器)為對象的。在實際應用中,常以磁盤文件作為對象。對象的。在實際應用中,常以磁盤文件作為對象。即從磁盤文件讀取數(shù)據(jù),將數(shù)據(jù)輸出到磁盤文件。即從磁盤文件讀取數(shù)據(jù),將數(shù)據(jù)輸出到磁盤文件。 所謂所謂“文件文件”,一般指存儲在外部介質上數(shù)據(jù)的集,一般指存儲在外部介質上數(shù)據(jù)的集合。一批數(shù)據(jù)是以文件的形式存放在外

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論