當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > C++中的標(biāo)準(zhǔn)輸入和輸出
一、 C++ 輸入輸出的含義
在C語言中我們的輸入和輸出都是以printf和scanf進(jìn)行操作的。他們都是函數(shù)。在C++中的我們的輸入輸出都是以終端為對(duì)象的,即從鍵盤輸入數(shù)據(jù),運(yùn)行結(jié)果輸出到顯示器屏幕上。從操作系統(tǒng)(Linux)的角度看,每一個(gè)與主機(jī)相連的輸入輸出設(shè)備都被看作一個(gè)文件。程序的輸入指的是從輸入文件將數(shù)據(jù)傳送給程序,程序的輸出指的是從程序?qū)?shù)據(jù)傳送給輸出文件。C++的輸入與輸出包括以下3方面的內(nèi)容:
1、對(duì)系統(tǒng)指定的標(biāo)準(zhǔn)設(shè)備的輸入和輸出。簡(jiǎn)稱標(biāo)準(zhǔn)I/O。(設(shè)備)
2、以外存磁盤(或光盤)文件為對(duì)象進(jìn)行輸入和輸出。簡(jiǎn)稱文件I/0。(文件)
3、對(duì)內(nèi)存中指定的空間進(jìn)行輸入和輸出。簡(jiǎn)稱串I/O。(內(nèi)存)
C++采取不同的方法來實(shí)現(xiàn)以上3種輸人輸出。 為了實(shí)現(xiàn)數(shù)據(jù)的有效流動(dòng),C++系統(tǒng)提供了龐大的I/O類庫(kù),調(diào)用不同的類去實(shí)現(xiàn)不同的功能。
二、 C++的I/O對(duì)C的發(fā)展—類型安全和可擴(kuò)展性
C語言中I/O存在問題:
1、在C語言中,用printf和scanf進(jìn)行輸入輸出,往往不能保證所輸入輸出的數(shù)據(jù)是可靠的、安全的。學(xué)過C語言的讀者可以分析下面的用法:想用格式符%d輸出一個(gè)整數(shù),但不小心錯(cuò)用了它輸出單精度變量和字符串,會(huì)出現(xiàn)什么情況?假定所用的系統(tǒng)int型占兩個(gè)字節(jié)。
printf("%d",i); //i為整型變量,正確,輸出i的值
printf("%d",f); //f為單精度變量,輸出變量中前兩個(gè)字節(jié)的內(nèi)容
printf("%d","C++");//輸出字符串"C++”的起始地址
編譯系統(tǒng)認(rèn)為以上語句都是合法的,而不對(duì)數(shù)據(jù)類型的合法性進(jìn)行檢查,顯然所得到的結(jié)果不是人們所期望的。
2、在用scanf輸入時(shí),有時(shí)出現(xiàn)的問題是很隱蔽的。如
scanf("%d",&i); //正確,輸入一個(gè)整數(shù),賦給整型變量i
scanf("%d",i); //漏寫&
假如已有聲明語句"int i=1",定義i為整型變量,其初值為1。編譯系統(tǒng)不認(rèn)為上面的scanf語句出錯(cuò),而是將輸入的值存放到地址為000001的內(nèi)存單元中,這個(gè)錯(cuò)誤可能產(chǎn)生嚴(yán)重的后果。
注意:C++為了與C兼容,保留了用printf和scanf進(jìn)行輸出和輸入的方法,以便使過去所編寫的大量的C程序仍然可以在C++的環(huán)境下運(yùn)行,但是希望讀者在編寫新的C++程序時(shí)不要用C的輸入輸出機(jī)制,而要用C++自己特有的輸入輸出方法。在C++的輸入輸出中,編譯系統(tǒng)對(duì)數(shù)據(jù)類型進(jìn)行嚴(yán)格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過編譯。因此C++的I/0操作是類型安全(typesafe)的。
3、用printf和scanf可以輸出和輸入標(biāo)準(zhǔn)類型(如:int,float,double,char)的數(shù)據(jù),但無法輸出用戶自己聲明的類型(如數(shù)組、結(jié)構(gòu)體、類)的數(shù)據(jù)。在C++中,會(huì)經(jīng)常遇到對(duì)類對(duì)象的輸入輸出,顯然無法使用printf和scanf來處理。C++的I/O操作是可擴(kuò)展的,不僅可以用來輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)據(jù)。C++對(duì)標(biāo)準(zhǔn)類型的數(shù)據(jù)和對(duì)用戶聲明類型數(shù)據(jù)的輸入輸出,采用同樣的方法處理。顯然,在用戶聲明了一個(gè)新類后,是無法用printf和scanf函數(shù)直接輸出和輸入這個(gè)類的對(duì)象的。
解決辦法:
可擴(kuò)展性是C++輸入輸出的重要特點(diǎn)之一,它能提高軟件的重用性,加快軟件的開發(fā)過程。
C++通過I/O類庫(kù)來實(shí)現(xiàn)豐富的I/0功能。這樣使C++的輸入輸出明顯地優(yōu)于C語言中的pfintf和scanf,但是也為之付出了代價(jià),C++的I/O系統(tǒng)變得比較復(fù)雜,要掌握許多細(xì)節(jié)。在本章中只能介紹其基本的概念和基本的操作,有些具體的細(xì)節(jié)可在日后實(shí)際深入應(yīng)用時(shí)再進(jìn)一步掌握。
三、 C++的輸入輸出流
輸入和輸出是數(shù)據(jù)傳送的過程,數(shù)據(jù)如流水一樣從一處流向另一處(單方向、一維)。C++形象地將此過程稱為流(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ù)流開辟一個(gè)內(nèi)存緩沖區(qū),用來存放流中的數(shù)據(jù)。當(dāng)用cout和插入運(yùn)算符“<<”向顯示器輸出數(shù)據(jù)時(shí),先將這些數(shù)據(jù)送到程序中的輸出緩沖區(qū)保存,直到緩沖區(qū)滿了或遇到endl,就將緩沖區(qū)中的全部數(shù)據(jù)送到顯示器顯示出來。在輸入時(shí),從鍵盤輸入的數(shù)據(jù)先放在鍵盤緩沖區(qū)中,當(dāng)按回車鍵時(shí),鍵盤緩沖區(qū)中的數(shù)據(jù)輸入到程序中的輸入緩沖區(qū),形成cin流,然后用提取運(yùn)算符“>>”從輸入緩沖區(qū)中提取數(shù)據(jù)送給程序中的有關(guān)變量?傊,流是與內(nèi)存緩沖區(qū)相對(duì)應(yīng)的,或者說,緩沖區(qū)中的數(shù)據(jù)就是流。
在C++中,輸入輸出流被定義為類。C++的I/0庫(kù)中的類稱為流類(streamclass)。用流類定義的對(duì)象稱為流對(duì)象。
前面曾多次說明,cout和cin并不是C++語言中提供的語句,它們是iostream類的對(duì)象,在未學(xué)習(xí)類和對(duì)象時(shí),在不致引起誤解的前提下,為敘述方便,把它們稱為cout語句和cin語句。正如C++并未提供賦值語句,只提供賦值表達(dá)式,在賦值表達(dá)式后面加分號(hào)就成了C++的語句,為方便起見,我們習(xí)慣稱之為賦值語句。又如,在C語言中常用printf和scanf進(jìn)行輸出和輸入,printf和scanf是C語言庫(kù)函數(shù)中的輸入輸出函數(shù),一般也習(xí)慣地將由printf和scanf函數(shù)構(gòu)成的語句稱為printf語句和scanf語句。在使用它們時(shí),對(duì)其本來的概念要有準(zhǔn)確的理解。
1.iostream類庫(kù)中有關(guān)的類
C++編譯系統(tǒng)提供了用于輸人輸出的iostream類庫(kù)。iostream這個(gè)單詞是由3個(gè)部分組成的,即i-o-stream,意為輸入輸出流。在iostream類庫(kù)中包含許多用于輸入輸出的類。
ios是抽象基類,由它派生出istream類和ostream類,兩個(gè)類名中第1個(gè)字母i和。分 別代表輸入(mput)和輸出(output)。istream類支持輸入操作,ostream類支持輸出操作, iostream類支持輸入輸出操作。iostream類是從istream類和ostream類通過多重繼承而派生的類。
C++對(duì)文件的輸人輸出需要用ifstream和ofstream類,兩個(gè)類名中第1個(gè)字母i和o分別代表輸入和輸出,第2個(gè)字母f代表文件(file)。ifstream支持對(duì)文件的輸入操作,ofstream支持對(duì)文件的輸出操作。類ifstream繼承了類istream,類ofstream繼承了類ostream,類fstream繼承了類iostream。
由圖可以看到:由抽象基類ios直接派生出4個(gè)派生類,即istream,ostream,fstreambase和strstreambase。其中fstreambase是文件流類基類,由它再派生出ifstream,ofstream和fstream。strstreambase是字符串流類基類,由它再派生出lstrstream,ostrsCeam和swsWeam類。
I/0類庫(kù)中還有其他一些類,但是對(duì)于一般用戶來說,以上這些已能滿足需要了。如果想深入了解類庫(kù)的內(nèi)容和使用,可參閱所用的C++系統(tǒng)的類庫(kù)手冊(cè)。在本章將陸續(xù)介紹有關(guān)的類。
2、與iostream類庫(kù)有關(guān)的頭文件
iostream類庫(kù)中不同的類的聲明被放在不同的頭文件中,用戶在自己的程序中用 #include命令包含了有關(guān)的頭文件就相當(dāng)于在本程序中聲明了所需要用到的類?梢該Q一種說法:頭文件是程序與類庫(kù)的接口,iostream類庫(kù)的接口分別由不同的頭文件來實(shí)現(xiàn)。常用的有
●iostream 包含了對(duì)(標(biāo)準(zhǔn))輸入輸出流進(jìn)行操作所需的基本信息。
●fstream 用于用戶管理的文件的I/0操作。
●strstream 用于字符串流I/0。
●stdiostream 用于混合使用C和C++的I/0機(jī)制時(shí),例如想將C程序轉(zhuǎn)變?yōu)镃++程序。
●iomamp 在使用格式化I/0時(shí)應(yīng)包含此頭文件。
3、在iostream頭文件中定義的流對(duì)象
在iostream頭文件中定義的類有:ios,istream,ostream,iostream,istream_withassign,ostream_withassign,iostream_withassign等。
iostream包含了對(duì)輸入輸出流進(jìn)行操作所需的基本信息。因此大多數(shù)C++程序都包括iostream。在iostream頭文件中不僅定義了有關(guān)的類,還定義了4種流對(duì)象,
cin是istream的派生類istream_withassign的對(duì)象,它是從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入到內(nèi)存的數(shù)據(jù)流,稱為cin流或標(biāo)準(zhǔn)輸入流。cout是ostream的派生類ostream_withassign的對(duì)象,它是從內(nèi)存輸入到標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)流,稱為cout流或標(biāo)準(zhǔn)輸出流。cerr和clog作用相似,均為向輸出設(shè)備(顯示器)輸出出錯(cuò)信息。因此用鍵盤輸入時(shí)用cin流,向顯示器輸出時(shí)用cout流。向顯示器輸出出錯(cuò)信息時(shí)用cerr和clog流。
在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)系起來,如果有
cout<<3;//就會(huì)在顯示器的屏幕上輸出3。
4.在iostream頭文件中重載運(yùn)算符
“<<”和“>>”本來在C++中是被定義為左位移運(yùn)算符和右位移運(yùn)算符的,由于在iosreeam頭文件中對(duì)它們進(jìn)行了重載,使它們能用作標(biāo)準(zhǔn)類型數(shù)據(jù)的輸入和輸出運(yùn)算符。所以,在用它們的程序中必須用#include命令把iostream包含到程序中。
#include
在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<<(int); //用于向輸出流插入一個(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++";
根據(jù)所介紹的知識(shí),上面的表達(dá)式相當(dāng)于 cout.operator<<("C++")
”C++”的值是其首字節(jié)地址,是字符型指針(char *)類型,因此選擇調(diào)用上面后一個(gè)運(yùn)算符重載函數(shù),通過重載函數(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,longdouble,char*,signedchar*,unsignedchar*等。
在ostream類中將“<<”重載為插入運(yùn)算符,其適用類型除了以上的標(biāo)準(zhǔn)類型外,還增加了一個(gè)void。類型。
如果想將“<<”和“>>”用于自己聲明的類型的數(shù)據(jù),就不能簡(jiǎn)單地采用包含iostream頭文件來解決,必須自己用介紹的方法對(duì)“<<”和“>>”進(jìn)行重載。
怎樣理解運(yùn)算符“<<”和“>>”的作用呢?有一個(gè)簡(jiǎn)單而形象的方法:它們指出了數(shù)據(jù)移動(dòng)的方向,例如: >>a // 箭頭方向表示把數(shù)據(jù)放入a中。
而: <<a // 箭頭方向表示從a中拿出數(shù)據(jù)。
5、標(biāo)準(zhǔn)輸出流:標(biāo)準(zhǔn)輸出流是流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)。
ostream類定義了3個(gè)輸出流對(duì)象,即cout,cerr,clog。分述如下。
cout是console output的縮寫,意為在控制臺(tái)(終端顯示器)的輸出。
3、cout流在內(nèi)存中對(duì)應(yīng)開辟了一個(gè)緩沖區(qū),用來存放流中的數(shù)據(jù)。當(dāng)向cout流插人一個(gè)endl時(shí),不論緩沖區(qū)是否已滿,都立即輸出流中所有數(shù)據(jù),然后插入一個(gè)換行符,并刷新流(清空緩沖區(qū))。注意如果插入一個(gè)換行符,'\n'(如coot<<<'\n';),則只輸出a和換行,而不刷新cout流(但并不是所有編譯系統(tǒng)都體現(xiàn)出這一區(qū)別)。<>
例1 有一元二次方程ax2+bx+c=0,其一般解為 x、1、2= ……但若a=0,或b^2-4ac<0時(shí),用此公式出錯(cuò)。
編程序,從鍵盤輸入a,b,c的值,求x1和x2。如果a=0或b^2-4ac<0,輸出出錯(cuò)信息。可寫出以下程序:
cerr<<"a is equal to zero,error!"<<endl;//將出錯(cuò)信息插入cerr,屏幕輸出
cerr<<"disc=b*b-4*a*c<0"<<endl; //將出錯(cuò)信息插入cerr流,屏幕輸出
{cout<<"x1="<<(-b+sqrt(disc))/(2*a)<<endl;
cout<<"x2="<<(-b-sqrt(disc))/(2*a)<<endl;}
③please input a,b,c; 1 2.5 1.5
應(yīng)當(dāng)注意:這些控制符是在頭文件iomanip中定義的,因而程序中應(yīng)當(dāng)包含頭文件iomanip。通過下面的例子可以了解使用它們的方法,
cout<<"dec:"<<dec<<a<<endl; //以上進(jìn)制形式輸出整數(shù)
cout<<"hex:"<<hex<<a<<endl; //以十六進(jìn)制形式輸出整數(shù)a
cout<<"oct:"<<setbase(8)<<a<<endl;//以八進(jìn)制形式輸出整數(shù)a
char *pt="China"; //pt指向字符串”China” //pt指向字符串”China”
cout<<setw(10)<<pt<<endl; //指定域?qū)挒?0,輸出字符
cout<<setfill('*')<<setw(10)<<pt<<endl;//指定域?qū)?0,輸出字符串,空白處以“*”填充
double pi=22.0/7.0; //計(jì)算pi值
cout<<setiosflags(ios::scientific)<<setprecision(8);//按指數(shù)形式輸出,8位小數(shù)
cout<<"pi="<<pi<<endl; //輸出pi值
cout<<"pi="<<setprecision(4)<<pi<<endl;//改為4位小數(shù)
cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;//改為小數(shù)形式輸出
***** China (域?qū)挒?0,空白處以'*'填充)
pi=3.14285714e+00 (指數(shù)形式輸出,8位小數(shù))
pi=3.1429e+00) (指數(shù)形式輸小,4位小數(shù))
除了可以用控制符來控制輸出格式外,還可以通過調(diào)用流對(duì)象COUt中用于控制輸出格式的成員函數(shù)來控制輸出格式。用于控制輸出格式的常用的成員函數(shù)見表4。
例3 用流控制成員函數(shù)輸出數(shù)據(jù)。
cout.setf(ios::showbase); //設(shè)置輸出時(shí)的基數(shù)符號(hào)
cout<<"dec:"<<a<<endl; //默認(rèn)以十進(jìn)制形式輸出a <
cout.unsetf(ios::dec); //終止十進(jìn)制的格式設(shè)置
cout.setf(ios::hex); //設(shè)置以十六進(jìn)制輸出的狀態(tài)
cout<<"hex:"<<a<<endl; //以十六進(jìn)制形式輸出a <
cout.unsetf(ios::hex); //終止十六進(jìn)制的格式設(shè)置
cout.setf(ios::oct); //設(shè)置以八進(jìn)制輸出的狀態(tài)
cout<<"oct:"<<a<<endl; //以八進(jìn)制形式輸出a <
cout.unsetf(ios::oct); //終止以八進(jìn)制的輸出格式設(shè)置
char *pt="China"; //pt指向字符串”china”
double pi=22.0/7.0; //計(jì)算pi值
cout.setf(ios::scientific);//指定用科學(xué)記數(shù)法輸出
cout.unsetf(ios::scientific); //終止科學(xué)記數(shù)法狀態(tài)
cout.setf(ios::fixed); //指定用定點(diǎn)形式輸出
cout.setf(ios::showpos); //在輸出正數(shù)時(shí)顯示“+”號(hào)
cout.setf(ios::internal); //數(shù)符出現(xiàn)在左側(cè)
cout.precision(6); //保留6位小數(shù)
cout<<pi<<endl; //輸出pi,注意數(shù)符“+”的位置
oct:025 (八進(jìn)制形式,以O(shè)開頭)
*****china (域?qū)挒?0,空白處以'*'填充)
pi=**3.142857e+00 (指數(shù)形式輸出,域?qū)?4,默認(rèn)6位小數(shù))
****3.142857 (小數(shù)形式輸㈩,精度為6,左側(cè)輸出數(shù)符“+”)
同理,程序倒數(shù)第8行的unsetf函數(shù)的調(diào)用也是不可缺少的。讀者不妨上機(jī)試一試。
可以在一個(gè)語句中連續(xù)調(diào)用put函數(shù)。如
cout.put(71),put(79).put(79).put(68).put('\n');
例4 有一個(gè)字符串"BASIC",要求把它們按相反的順序輸出。
{ char *a="BASIC"; //字符指引指向'B'
cout.put(*(a+i)); //從后一個(gè)字符開始輸出
例4也可以改用putchar函數(shù)實(shí)現(xiàn)。程序如下:
#include
運(yùn)行結(jié)果與前相同,成員函數(shù)put不僅可以用COUT流對(duì)象來調(diào)用,而且也可以用ostream類的其他流對(duì)象調(diào)用。
cin>>a>>b; // 若從鍵盤上輸入 21 abc出錯(cuò)
只有在正常狀態(tài)時(shí),才能從輸入流中提取數(shù)據(jù)。
如: if(!cin) //流cin處于出錯(cuò)狀態(tài),無法正常提取數(shù)據(jù)
例5 通過測(cè)試cin的真值,判斷流對(duì)象是否處于正常狀態(tài)。
while(cin>>grade) //如果能從cin流讀取數(shù)據(jù)cin的值為真,執(zhí)行循環(huán)體
{ if(grade>=85) cout<<grade<<" GOOD!"<<endl;
if(grade<60) cout<<grade<<" fail!"<<endl;
在遇到文件結(jié)束符時(shí),程序結(jié)束。如果某次輸入的數(shù)據(jù)為: enter grade:100/2 (回車)
流提取符“>>”提取100,賦給grade,進(jìn)行if語句的處理。然后再遇到“/”,認(rèn)為是無效字符,cin返回o。循環(huán)結(jié)束,輸出"Theend.”。
除了可以用CIB輸入標(biāo)準(zhǔn)類型的數(shù)據(jù)外,還可以用istream類流對(duì)象的一些成員函數(shù),實(shí)現(xiàn)字符的輸入。
流成員函數(shù)get有3種形式:無參數(shù)的,有一個(gè)參數(shù)的,有3個(gè)參數(shù)的。
其調(diào)用形式為: cin.get() //用來從指定的輸人流中提取一個(gè)字符(包括空白字符)函數(shù)的返回值就是讀入的字符。
1 study C++ very hard. (輸入一行字符)
2 study C++ very hard. (輸出該行字符)
C語言中的getchar函數(shù)與流成員函數(shù)cin.get()的功能相同,C++保留廠C的這種用法,可以用getchar(c)從鍵盤讀取一個(gè)字符賦給變量c。
cin.get(ch)// 其作用是從輸人流中讀取一個(gè)字符,賦給字符變量ch。
如果讀取成功則函數(shù)返回非。值(真),如失敗(遇文件結(jié)束符)則函數(shù)返回。值(假)。例6可以改寫如下:
cout<<"enter a sentence:"<<endl;
while(cin.get(c)) //讀取—個(gè)字符賦給字符變量c,如果讀取成功,cin.get(c)為真
cin.get(字符數(shù)組,字符個(gè)數(shù)n,終止字符)
cin.get(字符指針,字符個(gè)數(shù)n,終止字符)
cout<<"enter a sentence:”<<endl;
cin.get(ch,10,'\n'); //指定換行符為終止字符
2.用成員函數(shù)getline函數(shù)讀入一行字符
getline函數(shù)的作用是從輸人流中讀取一行字符,其用法與帶3個(gè)參數(shù)的get函數(shù)類 似。
即: cin.getline(字符數(shù)組(或字符指針),字符個(gè)數(shù)n,終止標(biāo)志字符)
cout<<"enter a sentence:"<<endl;
cout<<"The string read with cin is:"<<ch<<endl;
cin.getline(ch,20,'/');//讀19個(gè)字符或遇'/'結(jié)束
cout<<"The second part is:"<<ch<<endl;
cin.getline(ch,20); //讀l9個(gè)字符或遇'/n',結(jié)束
cout<<"The third part is:"<<ch<<endl;
enter a sentence:I like C++./I study C++./I am happy.(回車)
The third part is:I study C++./I am h
1、如果第2個(gè)cin.getline函數(shù)也寫成cin.getline(ch,20,'/'),輸出結(jié)果會(huì)如何?
除了以上介紹的用于讀取數(shù)據(jù)的成員函數(shù)外,lstream類還有其他在輸入數(shù)據(jù)時(shí)用得著的一些成員函數(shù)。常用的有以下幾種:
while(!cin.eof()) //eof()為假表示未遇到文件結(jié)束符
if((c=cin.get())!=' ')//檢查讀入的字符是否為空格字符
peek是“觀察”的意思,peek函數(shù)的作用是觀測(cè)下一個(gè)字符。其調(diào)用形式為
其作用是將前面用get或getline函數(shù)從輸人流中讀取的字符ch返回到輸人流,插入到當(dāng)前指針位置,以供后面讀取。
例9 peek函數(shù)和putback函數(shù)的用法。
cout<<"please enter a sentence."<
cout<<"The next character(ASCII code) is:"<<ch<<endl;
cin.putback(c[0]);//將'I'插入到指針?biāo)柑?/a>
cout<<"The second part is:"<<c<<endl;
I am a boy./I am astudent./ (回車)
The next chamcter(ASCII code) is:32 (下一個(gè)字符是空格)
The second part is:I an a student
如:ighore(5,A,) //跳過輸入流中5個(gè)字符,遇A后就不再跳了
也可以不帶參數(shù)或只帶一個(gè)參數(shù)。如
ignore() (n默認(rèn)值為1,終止字符默認(rèn)為EOF)
cout<<"The first part is:"<<ch<<endl;
cout<<"The second part is:"<<ch<<endl;
I like C++./I study C++./I am happy.
The second part is (字符數(shù)組ch中沒有從輸人流中讀取有效字符)
cout<<"The first part is:"<<ch<<endl;
cin.ignore(); //跳過輸入流中一個(gè)字符
cout<<"The second part is:"<<ch<<endl;
I like C++./I study C++./I am happy.
The second part is: I study C++.
以上介紹的各個(gè)成員函數(shù),不僅可以用cln流對(duì)象來調(diào)用,而且也可以用istream類的其他流對(duì)象調(diào)用。