版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十一章
輸入/輸出流第十一章輸入/輸出流學(xué)習(xí)目標(biāo)掌握C++輸入/輸出流(I/O流)的基本概念;能夠在輸入/輸出中進(jìn)行基本的格式控制;掌握文件的I/O操作。2學(xué)習(xí)目標(biāo)掌握C++輸入/輸出流(I/O流)的基本概念;2目錄11.1C++輸入輸出流的概念11.1.1什么是輸入輸出流11.1.2流類庫(kù)的頭文件11.1.3預(yù)定義流對(duì)象11.1.4I/O流庫(kù)的類體系11.1.5輸出流舉例11.1.6輸入流舉例3目錄11.1C++輸入輸出流的概念3目錄(續(xù))11.2無(wú)格式的輸入/輸出11.2.1無(wú)格式輸入11.2.2無(wú)格式輸出11.3有格式的輸入/輸出11.3.1默認(rèn)的輸入/輸出格式11.3.2格式標(biāo)志的設(shè)置11.3.3格式控制操縱符11.4I/O流的狀態(tài)4目錄(續(xù))11.2無(wú)格式的輸入/輸出4目錄(續(xù))11.5文件流11.5.1文件的概念11.5.2文件流的建立11.5.3文件流的關(guān)閉11.5.4兩種特殊的文件流11.6字符串流11.6.1字符串流的建立11.6.2字符串流的緩沖區(qū)操作11.7針對(duì)自定義類型重載>>和<<5目錄(續(xù))11.5文件流511.1.1什么是輸入/輸出流C++將數(shù)據(jù)從一個(gè)對(duì)象到另一個(gè)對(duì)象的流動(dòng)抽象為“流”。在程序中,“流”具體體現(xiàn)為一個(gè)對(duì)象,負(fù)責(zé)在數(shù)據(jù)生產(chǎn)者和數(shù)據(jù)消費(fèi)者之間建立聯(lián)系,控制數(shù)據(jù)的流動(dòng)。例如cin、cout就是兩個(gè)流對(duì)象。利用I/O流既可進(jìn)行有格式輸入/輸出,也可進(jìn)行無(wú)格式輸入/輸出。為了實(shí)現(xiàn)格式化的輸出,I/O流類庫(kù)提供了豐富的流操縱符,比如設(shè)置輸出域的寬度,設(shè)置輸出精度,設(shè)置填充字符等。611.1
C++輸入輸出流的概念11.1.1什么是輸入/輸出流C++將數(shù)據(jù)從一個(gè)對(duì)象到另一11.1.2流類庫(kù)的頭文件<iostream>:
包括istream、ostream、iostream以及cin、cout、ceer和clog對(duì)象的定義,同時(shí)提供非格式化和格式化的I/O服務(wù)。針對(duì)標(biāo)準(zhǔn)設(shè)備的I/O操作,須包含之。<sstream>:
包括istringstream、ostringstream、stringstream的定義,要使用字符串流對(duì)象進(jìn)行針對(duì)內(nèi)存字符串空間的I/O操作,須包含此文件。<fstream>:
包括ifstream、ofstream、fstream的定義,要使用文件流對(duì)象進(jìn)行針對(duì)磁盤(pán)文件的I/O操作,須包含此文件。<iomanip>:
包括setw、fixed等等操縱符的定義,利用操縱符進(jìn)行格式化I/O操作,須包含之。711.1
C++輸入輸出流的概念11.1.2流類庫(kù)的頭文件<iostream>: 711.11.1.3預(yù)定義流對(duì)象C++中一共有4個(gè)預(yù)定義流對(duì)象,它們的名稱及與之聯(lián)系的I/O設(shè)備如下:cin 標(biāo)準(zhǔn)輸入流對(duì)象,對(duì)應(yīng)標(biāo)準(zhǔn)輸入設(shè)備
cout 標(biāo)準(zhǔn)輸出流對(duì)象,對(duì)應(yīng)標(biāo)準(zhǔn)輸出設(shè)備
cerr 標(biāo)準(zhǔn)錯(cuò)誤信息輸出流對(duì)象,對(duì)應(yīng)標(biāo)準(zhǔn)出錯(cuò)信息輸出設(shè)備
clog 標(biāo)準(zhǔn)錯(cuò)誤信息輸出流對(duì)象,對(duì)應(yīng)帶緩沖的標(biāo)準(zhǔn)出錯(cuò)信息輸出設(shè)備這里提到的標(biāo)準(zhǔn)輸入設(shè)備和標(biāo)準(zhǔn)輸出設(shè)備是操作系統(tǒng)下的兩種虛擬設(shè)備,每種虛擬設(shè)備都與一種具體的設(shè)備相連接。通常情況下,標(biāo)準(zhǔn)輸入設(shè)備與鍵盤(pán)相連接,標(biāo)準(zhǔn)輸出設(shè)備與顯示器相連接,但可以重定向?yàn)榕c其他設(shè)備(如磁盤(pán))。在程序中可以定義自己的流對(duì)象(稱為自定義流對(duì)象),以滿足特定輸入、輸出需求。811.1
C++輸入輸出流的概念11.1.3預(yù)定義流對(duì)象C++中一共有4個(gè)預(yù)定義流對(duì)象,它11.1.4I/O流庫(kù)的類體系I/O流庫(kù)的類體系C++通過(guò)一系列的流類將不同類型數(shù)據(jù)的輸入/輸出操作封裝起來(lái),以面向?qū)ο蟮姆绞揭?guī)范各種輸入/輸出操作,提供了一套簡(jiǎn)化的操作界面,使得不同類型的數(shù)據(jù)的輸入/輸出可以采用相同的語(yǔ)法格式。部分流類之間的繼承關(guān)系如圖。911.1
C++輸入輸出流的概念11.1.4I/O流庫(kù)的類體系I/O流庫(kù)的類體系911.111.1.5輸出流舉例一個(gè)輸出流對(duì)象是信息流動(dòng)的目標(biāo),最重要的三個(gè)輸出流是ostream、ostringstream和ofstream。ostream是通用輸出流類,cout、cerr和clog都是它的對(duì)象;ostringstream是字符串輸出流類,它將一片內(nèi)存空間作為輸出設(shè)備;ofstream是文件輸出流類。1011.1
C++輸入輸出流的概念11.1.5輸出流舉例一個(gè)輸出流對(duì)象是信息流動(dòng)的目標(biāo),最重例11-1:向標(biāo)準(zhǔn)設(shè)備輸出字符串#include<iostream>usingnamespacestd;intmain(){
char*word="helloworld!";
doublepi=3.1415926;
intdayOfYear=365;
cout<<"valueofwordis:"<<word<<endl;
cout<<"PI="<<pi<<endl;
cout<<"daysofyear:"<<dayOfYear<<endl;
cout.put('B').put('C').put('\n');
return0;}1111.1輸入輸出流的概念——11.1.5輸出流舉例例11-1:向標(biāo)準(zhǔn)設(shè)備輸出字符串#include<iost運(yùn)行結(jié)果:valueofwordis:helloworld!PI=3.14159daysofyear:365BC例11-1(續(xù))11.1輸入輸出流的概念——11.1.5輸出流舉例運(yùn)行結(jié)果:例11-1(續(xù))11.1輸入輸出流的概念——1111.1.6輸入流舉例最重要的三個(gè)輸入流istream、istringstream和ifstream。Istream是通用輸入流類,cin即為它的對(duì)象;istringstream是字符串輸入流類,它將一片內(nèi)存空間作為輸入設(shè)備;ifstream是文件輸入流類。cin是預(yù)定義的標(biāo)準(zhǔn)輸入流對(duì)象。get()函數(shù)從指定流輸入一個(gè)字符并將這個(gè)值作為函數(shù)調(diào)用的返回值返回,在遇到文件尾時(shí)返回EOF。如果用流提取運(yùn)算符>>,注意流提取運(yùn)算符遇到空格就結(jié)束。1311.1
C++輸入輸出流的概念11.1.6輸入流舉例最重要的三個(gè)輸入流1311.1C+例11-2:輸入字符串#include<iostream>usingnamespacestd;intmain(){
intcharacter;
cout<<"beforeinput,cin.eof()="<<cin.eof()<<endl;
cout<<"pleaseinputasentence:"<<endl;
while((character=cin.get())!=EOF)
cout.put(character);
cout<<"EOFinthissystemis:"<<character<<endl;
cout<<"afterinputofEOF,cin.eof()="<<cin.eof()<<endl;
return0;}1411.1輸入輸出流的概念——11.1.6輸入流舉例例11-2:輸入字符串#include<iostream>運(yùn)行結(jié)果:beforeinput,cin.eof()=0pleaseinputasectence:IamagoodC++programmerIamagoodC++programmer^ZEOFinthissystemis:-1AfterinputofEOF,cin.eof()=1例11-2(續(xù))11.1輸入輸出流的概念——11.1.6輸入流舉例15運(yùn)行結(jié)果:例11-2(續(xù))11.1輸入輸出流的概念——11例11-3:輸入指定長(zhǎng)度的字符串#include<iostream>usingnamespacestd;intmain(){
constintSIZE=80;
charbuf1[SIZE];
charbuf2[SIZE];
cout<<"pleaseinputasentence:"<<endl;
cin>>buf1;
cout<<"thestringreadwithcinwas:"<<endl<<buf1<<endl;
cin.get(buf2,SIZE);
cout<<"thestringreadwithcin.getwas:"<<endl<<buf2<<endl;
return0;}1611.1輸入輸出流的概念——11.1.6輸入流舉例例11-3:輸入指定長(zhǎng)度的字符串#include<iost運(yùn)行結(jié)果:pleaseinputasectence:heisaC++programmerthestringreadwithcinwas:hethestringreadwithcin.getwas:isaC++programmer例11-3(續(xù))11.1輸入輸出流的概念——11.1.6輸入流舉例17運(yùn)行結(jié)果:例11-3(續(xù))11.1輸入輸出流的概念——1111.2無(wú)格式的輸入輸出無(wú)格式輸入/輸出是一種內(nèi)存映像式的輸入/輸出,不對(duì)數(shù)據(jù)做任何轉(zhuǎn)換,也稱為二進(jìn)制輸入/輸出,打開(kāi)文件的模式為ios_base::binary。無(wú)格式輸入/輸出主要針對(duì)二進(jìn)制磁盤(pán)文件,不能針對(duì)打印機(jī)、顯示器等字符設(shè)備。cin、cout等預(yù)定義流對(duì)象不能用于無(wú)格式輸入/輸出。1811.2無(wú)格式的輸入輸出無(wú)格式輸入/輸出是一種內(nèi)存映像式的11.2無(wú)格式的輸入輸出(續(xù))在下面有關(guān)函數(shù)的說(shuō)明中用到一些類型定義,包括:streamsize:表示流大小的類型,一般就是int或long;int_type:整數(shù)類類型,一般就是int或long;istream_type:輸入流類型,一般就是istream;ostream_type:輸出流類型,一般就是ostream;char_type:字符類類型,一般就是char;off_type:偏差(相對(duì)位置)類型,一般就是long;pos_type:位置類型,一般就是long。1911.2無(wú)格式的輸入輸出(續(xù))在下面有關(guān)函數(shù)的說(shuō)明中用到一11.2.1無(wú)格式的輸入與無(wú)格式輸入有關(guān)的類包括istream、istringstream和ifstream這三個(gè)輸入流類,以及stream、stringstream和fstream這三個(gè)輸入/輸出流類。無(wú)格式輸入有關(guān)的函數(shù)streamsizegcount()const;返回最近一次無(wú)格式輸入的字節(jié)數(shù)。int_typeget();返回提取的當(dāng)前輸入位置的字符(不會(huì)跳過(guò)空白字符),若已到流尾而無(wú)字符可輸入,返回EOF(即-1);istream_type&get(char_type&c);提取當(dāng)前輸入位置的字符(不會(huì)跳過(guò)空白字符)存入c,若已到流尾而無(wú)字符可輸入,存入c中的是'\0'。istream_type&get(char_type*s,streamsizen,char_typedelim);從當(dāng)前輸入位置開(kāi)始提取字符存入s所指的具有n個(gè)字節(jié)的字符空間中。2011.2無(wú)格式的輸入輸出11.2.1無(wú)格式的輸入與無(wú)格式輸入有關(guān)的類2011.211.2.1無(wú)格式的輸入(續(xù))無(wú)格式輸入有關(guān)的函數(shù)istream_type&get(char_type*s,streamsizen);
此函數(shù)調(diào)用
get(s,n,widen(‘\n’)),即已換行符為分界符,用以輸入一行字符,參見(jiàn)上面關(guān)于get函數(shù)的描述。istream_type&ignore(streamsizen=1,int_typedelim=traits::eof());
提取并舍棄(即不存儲(chǔ))從當(dāng)前輸入位置開(kāi)始的若干字符,因而只起到后移輸入位置的作用。int_typepeek();
返回當(dāng)前位置上的字符,但輸入位置不動(dòng),因此下一次輸入字符時(shí),得到還是同一字符。若已到流尾而無(wú)字符可輸入,返回EOF(即-1)。istream_type&unget();
使輸入位置倒退一個(gè)字符,使得上次被輸入的字符再次成為下一個(gè)輸入字符。istream_type&read(char_type*s,streamsizen);
從當(dāng)前輸入位置開(kāi)始提取字節(jié)存入s所指的具有n個(gè)字節(jié)的字符空間中。2111.2無(wú)格式的輸入輸出11.2.1無(wú)格式的輸入(續(xù))無(wú)格式輸入有關(guān)的函數(shù)211111.2.2無(wú)格式的輸出與輸出有關(guān)的類包括ostream、ostringstream和ofstream這三個(gè)輸出流類,以及stream、stringstream和fstream這三個(gè)輸入/輸出流類。與無(wú)格式輸出有關(guān)的函數(shù)ostream_type&put(char_typec);輸出字符costream_type&write(constchar_type*s,streamsizen);輸出s所指向的數(shù)據(jù)空間中的n個(gè)字節(jié)
2211.2無(wú)格式的輸入輸出11.2.2無(wú)格式的輸出與輸出有關(guān)的類2211.2無(wú)格式11.3.1默認(rèn)的輸入/輸出格式運(yùn)算符>>默認(rèn)的輸入格式short、int、long(signed、unsigned):與整型常量同;float、double、longdouble:與浮點(diǎn)數(shù)常量同;char(signed、unsigned):第一個(gè)非空白字符;char*(signed、unsigned):從第一個(gè)非空白字符開(kāi)始到下一個(gè)空白字符結(jié)束;bool:將true或1識(shí)別為邏輯真(true),其他的均識(shí)別為邏輯假(false);void*:無(wú)前綴的16進(jìn)制數(shù)。2311.3有格式的輸入輸出11.3.1默認(rèn)的輸入/輸出格式運(yùn)算符>>默認(rèn)的輸入格式2311.3.1默認(rèn)的輸入/輸出格式(續(xù))運(yùn)算符<<默認(rèn)的輸出格式char(signed、unsigned):?jiǎn)蝹€(gè)字符(無(wú)引號(hào))short、int、long(signed、unsigned):一般整數(shù)形式,負(fù)數(shù)前有-號(hào)char*(signed、unsigned):字符序列(無(wú)引號(hào))float、double、longdouble:浮點(diǎn)格式或指數(shù)格式(科學(xué)表示法),取決于哪個(gè)更短
void*:無(wú)前綴的16進(jìn)制數(shù)Bool:1或02411.3有格式的輸入輸出11.3.1默認(rèn)的輸入/輸出格式(續(xù))運(yùn)算符<<默認(rèn)的輸出格11.3.2格式標(biāo)志的設(shè)置2511.3有格式的輸入輸出11.3.2格式標(biāo)志的設(shè)置2511.3有格式的輸入輸出11.3.2格式標(biāo)志的設(shè)置(續(xù))2611.3有格式的輸入輸出11.3.2格式標(biāo)志的設(shè)置(續(xù))2611.3有格式的輸入11.3.3格式控制操縱符控制數(shù)制的操縱符:Dec功能:(初始狀態(tài))將整數(shù)按10進(jìn)制輸入/輸出;
等價(jià)函數(shù)調(diào)用:io.setf(ios_base::dec,ios_base::basefield)Oct功能:將整數(shù)按8進(jìn)制輸入/輸出;
等價(jià)函數(shù)調(diào)用:io.setf(ios_base::oct,ios_base::basefield)Hex功能:將整數(shù)按16進(jìn)制輸入/輸出;
等價(jià)函數(shù)調(diào)用:io.setf(ios_base::hex,ios_base::basefield)setbase(base)功能:設(shè)置為指定的數(shù)制,其中base為8、10或16;
等價(jià)函數(shù)調(diào)用:io.setf(ios_base::oct,ios::basefield)等控制數(shù)制標(biāo)志輸出的操縱符:showbase功能:為輸出的整數(shù)生成一個(gè)表示數(shù)制的前綴:對(duì)于八進(jìn)制數(shù)前面輸出一個(gè)無(wú)效0;對(duì)于十六進(jìn)制數(shù)前面輸出0x;
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::showbase)noshowbase功能:(初始狀態(tài))輸出的整數(shù)沒(méi)有表示數(shù)制的前綴
等價(jià)函數(shù)調(diào)用:o.unsetf(ios_base::showbase)2711.3有格式的輸入輸出11.3.3格式控制操縱符控制數(shù)制的操縱符:2711.311.3.3格式控制操縱符(續(xù))控制數(shù)制標(biāo)志中字母X的大小寫(xiě)的操縱符:Uppercase功能:將輸出的十六進(jìn)制數(shù)據(jù)(包括表示數(shù)制的前綴)中的字母以大寫(xiě)形式表示(如0X3F);
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::uppercase)nouppercase功能:(初始狀態(tài))將輸出的十六進(jìn)制數(shù)據(jù)(包括表示數(shù)制的前綴)中的字
母以小寫(xiě)形式表示(如0x3f)。
等價(jià)函數(shù)調(diào)用:o.unsetf(ios_base::uppercase))2811.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))控制數(shù)制標(biāo)志中字母X的大小例11-4:輸入/輸出的數(shù)制控制示例#include<iostream>#include<iomanip>usingnamespacestd;
intmain(){
inti,j;
cin>>hex>>i>>showbase>>j;
cout<<i<<'\t'<<j;
cout<<endl<<oct<<i<<'\t'<<showbase<<j<<endl;
return0;}2911.3有格式的輸入輸出——11.3.3格式控制操作符例11-4:輸入/輸出的數(shù)制控制示例#include<ios運(yùn)行結(jié)果:63250770372例11-4(續(xù))11.3有格式的輸入輸出——11.3.3格式控制操作符30運(yùn)行結(jié)果:例11-4(續(xù))11.3有格式的輸入輸出——1111.3.3格式控制操縱符(續(xù))輸入/輸出寬度的控制寬度控制是一種與格式標(biāo)志無(wú)關(guān)的控制。寬度的設(shè)置可用于輸入,但只對(duì)字符串輸入有效。對(duì)于輸入,寬度是指字符串空間的寬度,由于要存儲(chǔ)字符串結(jié)束符’\0’,因此實(shí)際可接收的輸入字符數(shù)比寬度少1。對(duì)于輸出,寬度是指最小輸出寬度。當(dāng)實(shí)際數(shù)據(jù)寬度小于指定的寬度時(shí),多余的位置用填充字符(通常是空格)添滿;當(dāng)實(shí)際數(shù)據(jù)的寬度大于設(shè)置的寬度時(shí),仍按實(shí)際的寬度輸出。初始寬度值為0,意味著所有數(shù)據(jù)都將按實(shí)際寬度輸入/輸出。寬度設(shè)置的效果沒(méi)有延續(xù)性,只對(duì)一個(gè)數(shù)據(jù)的輸入或輸出有效,在完成一個(gè)數(shù)據(jù)的輸入或輸出后,又回到初始寬度值0,即按實(shí)際數(shù)據(jù)寬度輸入或輸出。有關(guān)的操縱符是:setw(n) 功能:設(shè)置輸入/輸出寬度,其中n為表示寬度的整數(shù);等價(jià)函數(shù)調(diào)用:io.width(n)3111.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))輸入/輸出寬度的控制311例11-5:輸入/輸出寬度控制示例#include<iostream>#include<iomanip>usingnamespacestd;
intmain(){
chars1[20],s2[20];
cin>>setw(5)>>s1>>s2;
cout<<setw(8)<<s1<<'!'<<endl;
cout<<s1<<'!'<<endl;
cout<<setw(8)<<s2<<'!'<<endl;
return0;}3211.3有格式的輸入輸出——11.3.3格式控制操作符例11-5:輸入/輸出寬度控制示例#include<iost運(yùn)行結(jié)果:abcd!abcd!efghijklmnop!例11-5(續(xù))11.3有格式的輸入輸出——11.3.3格式控制操作符33運(yùn)行結(jié)果:例11-5(續(xù))11.3有格式的輸入輸出——1111.3.3格式控制操縱符(續(xù))輸出精度的控制精度的控制是一種與格式標(biāo)志無(wú)關(guān)的控制。精度是針對(duì)浮點(diǎn)數(shù)設(shè)置的,精度設(shè)置對(duì)于輸入流無(wú)效。對(duì)于輸出流,初始精度值為6,可以通過(guò)設(shè)置改為任意精度;將精度設(shè)置0意味著回到初始精度6。有關(guān)操縱符是:setprecision(n) 功能:設(shè)置浮點(diǎn)數(shù)的精度,其中n為精度的整數(shù);等價(jià)函數(shù)調(diào)用:o.precision(n),函數(shù)返回此前設(shè)置的精度;如果只需要這個(gè)返回值,可不給出參數(shù)。3411.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))輸出精度的控制3411.311.3.3格式控制操縱符(續(xù))浮點(diǎn)數(shù)輸出方式的控制浮點(diǎn)數(shù)都按浮點(diǎn)格式輸出,精度的含義是有效位的個(gè)數(shù),小數(shù)點(diǎn)的相對(duì)位置隨數(shù)據(jù)的不同而浮動(dòng);可以改變?cè)O(shè)置,使浮點(diǎn)數(shù)按定點(diǎn)格式或指數(shù)格式
(科學(xué)表示法,如3.2156e+2)輸出。在這種情況下,精度的含義是小數(shù)位數(shù),小數(shù)點(diǎn)的相對(duì)位置固定不變,必要時(shí)進(jìn)行舍入處理或添加無(wú)效0。有關(guān)操縱符有:resetiosflags(ios_base::floatfield)功能:(初始狀態(tài))浮點(diǎn)數(shù)按浮點(diǎn)格式輸出;
等價(jià)函數(shù)調(diào)用:o.setf(0,ios_base::floatfield)fixed 功能:浮點(diǎn)數(shù)按定點(diǎn)格式輸出;
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::fixed,ios_base::floatfield)scientific功能:浮點(diǎn)數(shù)按指數(shù)格式(科學(xué)表示法)輸出;
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::scientific,ios_base::floatfield)3511.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))浮點(diǎn)數(shù)輸出方式的控制351例11-6:設(shè)計(jì)函數(shù)sqrt_table(),它輸出一個(gè)平方根表,其中包含了所有不超過(guò)兩位數(shù)的平方根,精確到小數(shù)點(diǎn)后4位3611.3有格式的輸入輸出——11.3.3格式控制操作符例11-6:設(shè)計(jì)函數(shù)sqrt_table(),它輸出一個(gè)平方例11-6(續(xù))#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;
voidsqrt_table(){
cout<<endl<<"|";
inti;//以下3行顯示頂部表欄
for(i=0;i<10;i++)cout<<setw(7)<<i;cout<<endl<<"---+----------------------------------------------------------------------";
cout<<fixed<<setprecision(4); //設(shè)置為定點(diǎn)格式和4位精度
for(i=0;i<10;i++){ //十位數(shù)從0循環(huán)到9
cout<<endl<<setw(2)<<i<<"|“; //顯示左部表欄
for(intj=0;j<10;j++)cout<<setw(7)<<sqrt(i*10.0+j);
}
cout<<endl;}intmain(){
sqrt_table();
return0;}3711.3有格式的輸入輸出——11.3.3格式控制操作符例11-6(續(xù))#include<iostream>3711運(yùn)行結(jié)果:|0123456789--+----------------------------------------------------------------------------------------0|0.00001.00001.41421.73212.00002.23612.44952.64582.82843.00001|3.16233.31663.46413.60563.74173.87304.00004.12314.24264.35892|4.47214.58264.69044.79584.89905.00005.09905.19625.29155.38523|5.47725.56785.65695.74465.83105.91616.00006.08286.16446.24504|6.32466.40316.48076.55746.63326.70826.78236.85576.92827.00005|7.07117.14147.21117.28017.34857.41627.48337.54987.61587.68116|7.74607.81027.87407.93738.00008.06238.12408.18548.24628.30667|8.36668.42618.48538.54408.60238.66038.71788.77508.83188.88828|8.94439.00009.05549.11049.16529.21959.27369.32749.38089.43409|9.48689.53949.59179.64379.69549.74689.79809.84899.89959.9499例11-6(續(xù))11.3有格式的輸入輸出——11.3.3格式控制操作符38運(yùn)行結(jié)果:例11-6(續(xù))11.3有格式的輸入輸出——1111.3.3格式控制操縱符(續(xù))小數(shù)點(diǎn)處理方式的控制
此設(shè)置只影響采用浮點(diǎn)格式(而非定點(diǎn)格式或指數(shù)格式)輸出的浮點(diǎn)數(shù)據(jù)。在初始狀態(tài)下,若一浮點(diǎn)數(shù)的小數(shù)部分為0,則不輸出小數(shù)點(diǎn)及小數(shù)點(diǎn)后的無(wú)效0;可以改變這一設(shè)置,使得在任何情況下都輸出小數(shù)點(diǎn)及其后的無(wú)效0。有關(guān)操縱符有:showpoint功能:即使小數(shù)部分為0,也輸出小數(shù)點(diǎn)及其后的無(wú)效0;
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::showpoint)noshowpoint 功能:(初始狀態(tài))取消上述設(shè)置:小數(shù)部分為0時(shí)不輸出小數(shù)點(diǎn);
等價(jià)函數(shù)調(diào)用:o.unsetf(ios_base::showpoint)3911.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))小數(shù)點(diǎn)處理方式的控制391例11-7:小數(shù)點(diǎn)處理方式控制示例#include<iostream>usingnamespacestd;
intmain(){ cout<<3.0<<showpoint<<""<<3.0<<noshowpoint<<""<<3.0<<endl; cout<<fixed<<3.0<<showpoint<<""<<3.0<<noshowpoint<<""<<3.0<<endl; cout<<scientific<<3.0<<showpoint<<""<<3.0<<noshowpoint<<""<<3.0<<endl;
return0;}4011.3有格式的輸入輸出——11.3.3格式控制操作符例11-7:小數(shù)點(diǎn)處理方式控制示例#include<iost運(yùn)行結(jié)果:33.0000033.0000003.0000003.0000003.000000e+0003.000000e+0003.000000e+000例11-7(續(xù))11.3有格式的輸入輸出——11.3.3格式控制操作符41運(yùn)行結(jié)果:例11-7(續(xù))11.3有格式的輸入輸出——1111.3.3格式控制操縱符(續(xù))小數(shù)點(diǎn)處理方式的控制對(duì)齊方式的控制初始狀態(tài)為右對(duì)齊;可以改變這一設(shè)置,使得輸出采用左對(duì)齊方式或內(nèi)部對(duì)齊方式。只有在設(shè)置了寬度的情況下,對(duì)齊操作才有意義。有關(guān)操縱符有:left功能:在設(shè)定的寬度內(nèi)左對(duì)齊輸出,右端填以設(shè)定的填充字符;
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::left,ios_base::adjustfield)Right功能:(初始狀態(tài))在設(shè)定的寬度內(nèi)右對(duì)齊輸出,左端填以設(shè)定的填充字符;
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::right,ios_base::adjustfield)internal功能:(內(nèi)部對(duì)齊)在設(shè)定的寬度內(nèi)右對(duì)齊輸出,左端填以設(shè)定的填充字符;但若有符號(hào)(-或+),符號(hào)置于設(shè)定寬度的最左端;
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::internal,ios_base::adjustfield)4211.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))小數(shù)點(diǎn)處理方式的控制42111.3.3格式控制操縱符(續(xù))填充字符的控制填充字符控制是一種與格式標(biāo)志無(wú)關(guān)的格式控制。在指定的輸出寬度內(nèi)輸出數(shù)據(jù)時(shí),多余的位置要用填充字符填滿。初始的填充字符為空格,可以設(shè)置任意字符作為填充字符。只有在設(shè)置了寬度的情況下,字符填充操作才有意義。有關(guān)操縱符是:setfill(c)功能:設(shè)置填充字符,其中c為一字符;
等價(jià)函數(shù)調(diào)用:io.fill(c),函數(shù)返回此前設(shè)置的填充字符;如果只需要這個(gè)返回值,可不給參數(shù)。4311.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))填充字符的控制4311.3例11-8:對(duì)齊方式及填充字符控制示意#include<iostream>#include<iomanip>usingnamespacestd;
intmain(){ cout<<setfill('*'); cout<<setw(10)<<-45; cout<<endl<<left<<setw(10)<<-55; cout<<endl<<internal<<setw(10)<<-65<<endl;
return0;}4411.3有格式的輸入輸出——11.3.3格式控制操作符例11-8:對(duì)齊方式及填充字符控制示意#include<io運(yùn)行結(jié)果:*******-45-55*******-*******65例11-8(續(xù))11.3有格式的輸入輸出——11.3.3格式控制操作符45運(yùn)行結(jié)果:例11-8(續(xù))11.3有格式的輸入輸出——1111.3.3格式控制操縱符(續(xù))非負(fù)數(shù)的符號(hào)表示方式的控制在初始狀態(tài)下,0或正數(shù)前不用任何符號(hào);可以改變這一設(shè)置,使得在0或正數(shù)前無(wú)條件地加上符號(hào)+。有關(guān)操縱符有:showpos功能:0或正數(shù)前加上符號(hào)+;
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::showpos)noshowpos功能:(初始狀態(tài))0或正數(shù)前不用任何符號(hào);
等價(jià)函數(shù)調(diào)用:o.unsetf(ios_base::showpos)邏輯值輸出方式的控制在初始狀態(tài)下,邏輯值true和false輸出為1和0;可以改變?cè)O(shè)置,使之輸出為true和false。有關(guān)操縱符有:boolalpha功能:將邏輯值輸出為true和false;
等價(jià)函數(shù)調(diào)用:io.setf(ios_base::boolalpha)noboolalpha 功能:(初始狀態(tài))取消上述設(shè)置:將邏輯值輸出為1和0;等價(jià)函數(shù)調(diào)用:io.unsetf(ios_base::boolalpha)4611.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))非負(fù)數(shù)的符號(hào)表示方式的控制例11-9:非負(fù)數(shù)的符號(hào)表示方式及邏輯常量輸出方式的控制的示意#include<iostream>#include<iomanip>usingnamespacestd;
intmain(){ cout<<0<<'\t'<<5<<'\t'<<-5<<endl; cout<<showpos<<0<<'\t'<<5<<'\t'<<-5<<endl; cout<<noshowpos<<(5>3)<<'\t'<<(5<3)<<endl; cout<<boolalpha<<(5>3)<<'\t'<<(5<3)<<endl;
return0;}4711.3有格式的輸入輸出——11.3.3格式控制操作符例11-9:非負(fù)數(shù)的符號(hào)表示方式及邏輯常量輸出方式的控制的示運(yùn)行結(jié)果:05-5+0+5-510truefalse例11-9(續(xù))11.3有格式的輸入輸出——11.3.3格式控制操作符運(yùn)行結(jié)果:例11-9(續(xù))11.3有格式的輸入輸出——1111.3.3格式控制操縱符(續(xù))前導(dǎo)空白字符處理方式的控制
初始狀態(tài)下,輸入一數(shù)據(jù)時(shí)首先跳過(guò)前導(dǎo)空白字符??梢酝ㄟ^(guò)設(shè)置,使得輸入時(shí)不跳過(guò)空白字符。這樣的設(shè)置一直有效,直到改變?cè)O(shè)置為止。有關(guān)操縱符有:skipws功能:(初始狀態(tài))每次輸入時(shí)跳過(guò)前導(dǎo)空白字符;
等價(jià)函數(shù)調(diào)用:i.setf(ios_base::skipws)noskipws功能:每次輸入時(shí)不跳過(guò)前導(dǎo)空白字符;
等價(jià)函數(shù)調(diào)用:i.unsetf(ios_base::skipws)緩沖區(qū)工作方式的控制在一般情況下,輸出的數(shù)據(jù)暫存在輸出緩沖區(qū)中,直到緩沖區(qū)滿或流被關(guān)閉時(shí)才送往有關(guān)設(shè)備有關(guān)操縱符有:unitbuf功能:每次輸出后立即寫(xiě)緩
等價(jià)函數(shù)調(diào)用:o.setf(ios_base::unitbuf)nounitbuf功能:(初始狀態(tài))數(shù)據(jù)輸出到緩沖區(qū)暫不寫(xiě)出,待緩沖區(qū)滿或流被關(guān)閉時(shí)才寫(xiě)出到所連接的設(shè)備中;
等價(jià)函數(shù)調(diào)用:o.unsetf(ios_base::unitbuf)4911.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))前導(dǎo)空白字符處理方式的控制11.3.3格式控制操縱符(續(xù))其他輸入/輸出控制操縱符還有幾個(gè)操縱符的功能不是格式控制,而是直接執(zhí)行特定的輸入/輸出操作。有關(guān)操縱符有:Endl功能:插入換行符(即‘\n’)并強(qiáng)制寫(xiě)緩,實(shí)現(xiàn)輸出回車換行;
等價(jià)函數(shù)調(diào)用:o..put('\n').flush()Ends功能:插入字符串結(jié)束符‘\0’,常用于字符串流;
等價(jià)函數(shù)調(diào)用:o.put('\0')Ws功能:在noskipws狀態(tài)下輸入時(shí),用來(lái)跳過(guò)前導(dǎo)空白字符。Flush功能:強(qiáng)制寫(xiě)緩
等價(jià)函數(shù)調(diào)用:o.flush()5011.3有格式的輸入輸出11.3.3格式控制操縱符(續(xù))其他輸入/輸出控制操縱符5例11-10:通過(guò)使用文件名“CON”創(chuàng)建輸入文件流對(duì)象is和輸出文件流對(duì)象os,用來(lái)模擬預(yù)定義流對(duì)象cin和cout進(jìn)行針對(duì)鍵盤(pán)和顯示器的輸入/輸出5111.3有格式的輸入輸出——11.3.3格式控制操作符例11-10:通過(guò)使用文件名“CON”創(chuàng)建輸入文件流對(duì)象is例11-10(續(xù))#include<iostream>#include<iomanip>#include<fstream>usingnamespacestd;
intmain(){ intx; ofstreamos("con"); ifstreamis("con");// is.tie(&os); //解決方案3// os<<unitbuf; //解決方案2 os<<"請(qǐng)輸入一個(gè)整數(shù):";// os<<flush; //解決方案1 is>>x; os<<"輸入的整數(shù)是:"<<x<<endl;
return0;}5211.3有格式的輸入輸出——11.3.3格式控制操作符例11-10(續(xù))#include<iostream>521運(yùn)行結(jié)果1:這是所有注釋語(yǔ)句行保持原樣時(shí)的運(yùn)行結(jié)果,其中第一行為鍵盤(pán)輸入:123請(qǐng)輸入一個(gè)整數(shù):輸入的整數(shù)是:123運(yùn)行結(jié)果2:把標(biāo)有“解決方案1”、“解決方案2”、“解決方案3”的注釋語(yǔ)句中任何一個(gè)語(yǔ)句行的行首的//去掉,再運(yùn)行程序,三次的運(yùn)行結(jié)果相同:請(qǐng)輸入一個(gè)整數(shù):123輸入的整數(shù)是:123例11-10(續(xù))11.3有格式的輸入輸出——11.3.3格式控制操作符53運(yùn)行結(jié)果1:例11-10(續(xù))11.3有格式的輸入輸出——11.4I/O流的狀態(tài)C++I/O流的狀態(tài)用ios_base中一組狀態(tài)標(biāo)志位來(lái)表示,同時(shí)定義了一組判斷、操縱這些標(biāo)志位的成員函數(shù),常用的有boolgood()const:剛進(jìn)行的操作成功時(shí)返回true,否則返回false;boolfail()const:與good()相反,剛進(jìn)行的操作失敗時(shí)返回true,否則返回false;boolbad()const:如果進(jìn)行了非法操作返回true,否則返回false;bad()為true時(shí)fail()必為true;booleof()const:進(jìn)行輸入操作時(shí),若到達(dá)流尾返回true,否則返回false,通常只用于輸入流;eof()為true時(shí)fail()必為true;voidclear():將流置為正常狀態(tài),使得good()返回true。5411.4I/O流的狀態(tài)C++I/O流的狀態(tài)用ios_ba例11-11:錯(cuò)誤輸入后的錯(cuò)誤狀態(tài)#include<iostream>usingnamespacestd;
intmain(){ intintValue;
cout<<"statebeforeabadinputoperation:"<<endl; cout<<"cin.rdstate():"<<cin.rdstate()<<endl <<"cin.eof():"<<cin.eof()<<endl <<"cin.fail():"<<cin.fail()<<endl <<"cin.bad():"<<cin.bad()<<endl <<"cin.good():"<<cin.good()<<endl;5511.4
I/O流的狀態(tài)例11-11:錯(cuò)誤輸入后的錯(cuò)誤狀態(tài)#include<ios例11-11(續(xù))cout<<“expectaninteger,butenteracharacter:”;cin>>intValue; cout<<“stateafterabadinputoperation:”<<endl;cout<<“cin.rdstate():”<<cin.rdstate()<<endl <<“cin.eof():”<<cin.eof()<<endl <<“cin.fail():”<<cin.fail()<<endl <<“cin.bad():”<<cin.bad()<<endl <<“cin.good():”<<cin.good()<<endl;cin.clear();cout<<“stateafterclear:”<<endl;cout<<“cin.fail():”<<cin.fail()<<endl
<<"cin.good():"<<cin.good()<<endl;
return0;}5611.4
I/O流的狀態(tài)例11-11(續(xù))cout<<“expectaninte運(yùn)行結(jié)果1:statebeforeabadinputoperation:cin.rdstate():0cin.eof():0cin.fail():0cin.bad():0cin.good():1expectaninteger,butenteracharacter:Astateafterabadinputoperation:cin.rdstate():2cin.eof():0cin.fail():1cin.bad():0cin.good():0stateafterclear:cin.fail():0cin.good():1例11-11(續(xù))11.4
I/O流的狀態(tài)57運(yùn)行結(jié)果1:例11-11(續(xù))11.4I/O流的狀態(tài)5711.5.1文件的概念磁盤(pán)文件以及視作文件的外部設(shè)備在磁盤(pán)上保存的信息是按文件的形式組織的,每個(gè)文件都有一個(gè)文件名,并且保存在一個(gè)確定的文件夾中。另外,操作系統(tǒng)把其他類型的一些外部設(shè)備也以文件的方式進(jìn)行操作,視作特殊的文件。例如,把由鍵盤(pán)和顯示器組成的終端看作為輸入/輸出文件,當(dāng)向它輸出信息時(shí)就是輸出到顯示器,當(dāng)從它輸入信息時(shí)就是從鍵盤(pán)輸入。文本文件和二進(jìn)制文件文本文件可以是磁盤(pán)文件,也可以是鍵盤(pán)、顯示器、打印機(jī)等稱為字符設(shè)備的外部設(shè)備。因此,適用于文本文件的操作也同樣適用于鍵盤(pán)、顯示器、打印機(jī)等設(shè)備,而適用于cin、cout等預(yù)定義流對(duì)象的操作也同樣適應(yīng)于文本文件。可以用文本編輯器來(lái)查看、輸入、修改一個(gè)文本文件。二進(jìn)制文件只能是磁盤(pán)文件。5811.5文件流11.5.1文件的概念磁盤(pán)文件以及視作文件的外部設(shè)備58111.5.1文件的概念(續(xù))輸入文件、輸出文件和輸入/輸出文件
對(duì)文件的訪問(wèn)操作包括輸入和輸出兩種類型的操作。如果一個(gè)文件是為輸入操作而打開(kāi)的,該文件就稱為輸入文件。如果一個(gè)文件是為輸出操作而打開(kāi)的,就稱為輸出文件。有的文件打開(kāi)后既用于輸入,也用于輸出,則稱之為輸入/輸出文件。5911.5文件流11.5.1文件的概念(續(xù))輸入文件、輸出文件和輸入/輸出11.5.2文件流的建立每個(gè)文件流都應(yīng)當(dāng)與一個(gè)打開(kāi)的文件相聯(lián)系??梢杂脙煞N不同的方式打開(kāi)文件。 1)在建立文件流對(duì)象的同時(shí)打開(kāi)文件
如:ifstreamfin("datafile.dat"); 2)先建立文件流對(duì)象,再在適當(dāng)?shù)臅r(shí)候打開(kāi)文件,
如:ifstreamfin;…… fin.open("datafile.dat");6011.5文件流11.5.2文件流的建立每個(gè)文件流都應(yīng)當(dāng)與一個(gè)打開(kāi)的文件相11.5.2文件流的建立(續(xù))可以通過(guò)構(gòu)造函數(shù)或open函數(shù)的第二個(gè)參數(shù),指定文件的打開(kāi)模式。打開(kāi)模式被定義為一組枚舉常量:
6111.5文件流11.5.2文件流的建立(續(xù))可以通過(guò)構(gòu)造函數(shù)或open函11.5.3文件流的關(guān)閉關(guān)閉文件流用成員函數(shù)close().例如若fin是一個(gè)文件流對(duì)象,則可用下面的語(yǔ)句關(guān)閉:fin.close();如果程序沒(méi)有用close()主動(dòng)關(guān)閉文件,則在文件流對(duì)象退出其作用域時(shí),將自動(dòng)調(diào)用文件流對(duì)象的析構(gòu)函數(shù)關(guān)閉所聯(lián)系的文件。緩沖區(qū)中尚未寫(xiě)入文件的數(shù)據(jù)將在文件關(guān)閉時(shí)實(shí)際地寫(xiě)入到文件中。當(dāng)不再使用文件時(shí)立即關(guān)閉文件是一個(gè)好的習(xí)慣,這除了能夠盡早釋放流對(duì)象所占用的計(jì)算機(jī)資源之外,還有利于文件中數(shù)據(jù)的安全。6211.5文件流11.5.3文件流的關(guān)閉關(guān)閉文件流用成員函數(shù)close()11.5.4兩種特殊的文件流以文件名"CON"打開(kāi)的輸入文件流所聯(lián)系的設(shè)備是鍵盤(pán),可用于鍵盤(pán)輸入;以"CON"為文件名打開(kāi)的輸出文件流所聯(lián)系的設(shè)備是顯示器,以"CON"為文件名打開(kāi)的輸入/輸出文件流所聯(lián)系的設(shè)備是終端,即鍵盤(pán)加顯示器。用文件名"PRN"打開(kāi)的輸出文件流所聯(lián)系的設(shè)備是打印機(jī),例如:ofstreamPrinter("PRN");
Print<<"此行文字被打印出來(lái)"<<endl;6311.5文件流11.5.4兩種特殊的文件流以文件名"CON"打開(kāi)的輸入文例11-12:
CopyFile接收兩個(gè)參數(shù):輸入文件名和輸出文件名,完成從輸入文件和輸出文件的拷貝6411.5文件流——11.5.4兩種特殊的文件流例11-12:CopyFile接收兩個(gè)參數(shù):輸入文件名和輸例11-12(續(xù))//CopyFile.h#include<iostream>#include<fstream>usingnamespacestd;voidCopyFile(constchar*from,constchar*to);6511.5文件流——11.5.4兩種特殊的文件流例11-12(續(xù))//CopyFile.h6511.5文件例11-12(續(xù))//CopyFile.cpp#include"CopyFile.h"voidCopyFile(constchar*from,constchar*to){ cin.clear(); ifstreaminf(from); if(!inf){ cerr<<"輸入文件打開(kāi)失??!"<<endl; exit(1); } ofstreamoutf(to,ios_base::trunc); if(!outf){ cerr<<"輸出文件打開(kāi)失??!"<<endl; exit(3); } while(!inf.eof())outf.put(inf.get()); inf.close(); outf.close();}6611.5文件流——11.5.4兩種特殊的文件流例11-12(續(xù))//CopyFile.cpp6611.5例11-12(續(xù))//11-12.cpp#include"CopyFile.h"
intmain(){ charfin[30],fout[30]; cout<<"輸入文件:";cin>>fin; cout<<"輸出文件:";cin>>fout; CopyFile(fin,fout);
return0;}6711.5文件流——11.5.4兩種特殊的文件流例11-12(續(xù))//11-12.cpp6711.5文件流運(yùn)行結(jié)果:輸入文件:copyfile.h輸出文件:con//CopyFile.h#include<iostream>#include<fstream>usingnamespacestd;voidCopy(constchar*from,constchar*to);例11-12(續(xù))11.5文件流——11.5.4兩種特殊的文件流68運(yùn)行結(jié)果:例11-12(續(xù))11.5文件流——11.5.411.6.1字符串流的建立字符串流以內(nèi)存中的一個(gè)字符串緩沖區(qū)為輸入/輸出對(duì)象。istringstream是字符串輸入流類,ostringstream是字符串輸出流類,stringstream是字符串輸入/輸出流類。字符串流有一個(gè)需要兩個(gè)參數(shù)的構(gòu)造函數(shù),第一個(gè)通過(guò)一個(gè)字符串為緩沖區(qū)提供初始數(shù)據(jù),第二個(gè)用于指定打開(kāi)模式。對(duì)應(yīng)于ostringstream、istringstream和stringstream這三種不同的字符串流,第二個(gè)參數(shù)的默認(rèn)值分別是:ios_base::out、ios_base::in和ios_base::out
|
ios_base::in。6911.6字符串流11.6.1字符串流的建立字符串流以內(nèi)存中的一個(gè)字符串緩沖區(qū)11.6.1字符串流的建立(續(xù))字符串流還有一個(gè)只需要一個(gè)參數(shù)的構(gòu)造函數(shù),該參數(shù)與前述構(gòu)造函數(shù)的第二個(gè)構(gòu)造函數(shù)相同,用于指定打開(kāi)模式,也有默認(rèn)值。下面是創(chuàng)建字符流的幾個(gè)例子:ostringstreamost1(“Thisisastring”,ios_base::app);ostringstreamost2;istringstreamist1(“Thisisastring”);istringstreamist2;stringstreamst;7011.6字符串流11.6.1字符串流的建立(續(xù))字符串流還有一個(gè)只需要一個(gè)參11.6.2字符串流的緩沖區(qū)操作字符串流除了可以用rdbuf函數(shù)訪問(wèn)和設(shè)置緩沖區(qū)外,還有一個(gè)更方便的str函數(shù),它把緩沖區(qū)中的數(shù)據(jù)視為一個(gè)字符串:stringstr()const;
返回緩沖區(qū)中的字符串voidstr(conststring&str);
設(shè)置緩沖區(qū)中的字符串7111.6字符串流11.6.2字符串流的緩沖區(qū)操作字符串流除了可以用rdbu例11-13:函數(shù)wordPicker提取輸入流中的每個(gè)詞,并按原來(lái)的順序顯示輸出,但用逗號(hào)作為詞之間的分隔符7211.6字符串流——11.6.2字符串流的緩沖區(qū)操作例11-13:函數(shù)wordPicker提取輸入流中的每個(gè)詞,#include<iostream>#include<sstream>usingnamespacestd;
voidwordPicker(istream&is){ stringword; while(is>>word)cout<<word<<','; cout<<endl;}intmain(){ istringstreamsrc("Thisisastring"); wordPicker(src); src.clear(); //清除“eof”,將狀態(tài)置為“good” src.str(“Thisisanotherstring”);//用參數(shù)字符串替換緩沖區(qū) wordPicker(src);cout<<“Keyinsomewords:”; wordPicker(cin);cout<<endl; return0;}7311.6字符串流——11.6.2字符串流的緩沖區(qū)操作例11-13(續(xù))#include<iostream>7311.6字符串流—運(yùn)行結(jié)果:This,is,a,string,This,is,another,string,Keyinsomewords:ThisisthethirdstringThis,is,the,third,string,^Z例11-13(續(xù))11.6字符串流——11.6.2字符串流的緩沖區(qū)操作74運(yùn)行結(jié)果:例11-13(續(xù))11.6字符串流——11.6.11.7針對(duì)自定義類型重載>>和<<可以針對(duì)自定義類型重載提取運(yùn)算符>>和插入運(yùn)算符<<,單只可能作為全局函數(shù)重載。重載這兩個(gè)運(yùn)算符函數(shù)須使用如下原形:istream&operator>>(istream&is,<類名>&obj);
ostream&operator<<(ostream&os,<類名>obj);其中ostream的第二個(gè)參數(shù)也可以是const<類名>&obj。7511.7針對(duì)自定義類型重載>>和<<可以針對(duì)自定義類型重載例11-14:對(duì)自定義類DoubleArray重載>>和<<,用以完成數(shù)組的輸入和輸出7611.7針對(duì)自定義類型重載例11-14:對(duì)自定義類DoubleArray重載>>和<<//DoubleArray.h#include<iostream>usingnamespacestd;
classDoubleArray{ intmin_index; intmax_index; double*data;public: DoubleArray(intmin,intmax); DoubleArray(intmax); DoubleArray(){delete[]data;}; double&operator[](intindex)const; intgetMinIndex()const{returnmin_index;} intgetMaxIndex()const{returnmax_index;}};
istream&operator>>(istream&is,DoubleArray&a);ostream&operator<<(ostream&os,constDoubleArray&a);7711.7針對(duì)自定義類型重載例11-14(續(xù))//DoubleArray.h7711.7針對(duì)自定義類型重//DoubleArray.cpp#include"DoubleArray.h"DoubleArray::DoubleArray(intmin,intmax):min_index(min),max_index(max){if(min>max){//若下標(biāo)范圍的下界大于上界,顯示出錯(cuò)信息并退出 cout<<"Errorindexrange"; exit(1);}data=newdouble[max_index-min_index+1];}
DoubleArray::DoubleArray(intmax):min_index(0),max_index(max){ data=newdouble[max_index+1];}7811.7針對(duì)自定義類型重載例11-14(續(xù))//DoubleArray.cpp7811.7針對(duì)自定義類double&DoubleArray::operator[](intindex)const{ if(index<min_index||index>max_index){//若下標(biāo)越界,顯示出錯(cuò)信息并退出 cout<<"Indexoutofrange"; exit(1); } returndata[index-min_index];}
istream&operator>>(istream&is,DoubleArray&a){ for(inti=a.getMinIndex();i<=a.getMaxIndex();i++) is>>a[i]; returnis;}
ostream&operator<<(ostream&os,constDoubleArray&a){ for(inti=a.getMinIndex();i<=a.getMaxIndex();i++)os<<a[i]<<''; returnos;}7911.7針對(duì)自定義類型重載例11-14(續(xù))double&DoubleArray::operator例11-14(續(xù))//11-14.cpp#include"DoubleArray.h"intmain(){ DoubleArrayx(3,8); cout<<"請(qǐng)輸入"<<(x.getMaxIndex()-x.getMinIndex()+1)<<"個(gè)數(shù)據(jù):"; cin>>x; cout<<"剛輸入的數(shù)據(jù)是:"; cout<<x<<endl;
return0;}8011.7針對(duì)自定義類型重載例11-14(續(xù))//11-14.cpp8011.7針對(duì)自運(yùn)行結(jié)果:請(qǐng)輸入6個(gè)數(shù)據(jù):123456剛輸入的數(shù)據(jù)是:123456例11-14(續(xù))11.7針對(duì)自定義類型重載81運(yùn)行結(jié)果:例11-14(續(xù))11.7針對(duì)自定義類型重載81小結(jié)本章我們主要學(xué)習(xí)了如何使用流進(jìn)行輸入/輸出。首先介紹了流的基本概念,其次講述了無(wú)格式和有格式的輸入/輸出方法和注意事項(xiàng),然后介紹了流在文家輸入/輸出中的應(yīng)用和字符串流,最后介紹了插入運(yùn)算符<<和提取運(yùn)算符>>在自定義類型中的重載。82小結(jié)本章我們主要學(xué)習(xí)了如何使用流進(jìn)行輸入/輸出。首先介紹了流第十一章
輸入/輸出流第十一章輸入/輸出流學(xué)習(xí)目標(biāo)掌握C++輸入/輸出流(I/O流)的基本概念;能夠在輸入/輸出中進(jìn)行基本的格式控制;掌握文件的I/O操作。84學(xué)習(xí)目標(biāo)掌握C++輸入/輸出流(I/O流)的基本概念;2目錄11.1C++輸入輸出流的概念11.1.1什么是輸入輸出流11.1.2流類庫(kù)的頭文件11.1.3預(yù)定義流對(duì)象11.1.4I/O流庫(kù)的類體系11.1.5輸出流舉例11.1.6輸入流舉例85目錄11.1C++輸入輸出流的概念3目錄(續(xù))11.2無(wú)格式的輸入/輸出11.2.1無(wú)格式輸入11.2.2無(wú)格式輸出11.3有格式的輸入/輸出11.3.1默認(rèn)的輸入/輸出格式11.3.2格式標(biāo)志的設(shè)置11.3.3格式控制操縱符11.4I/O流的狀態(tài)86目錄(續(xù))11.2無(wú)格式的輸入/輸出4目錄(續(xù))11.5文件流11.5.1文件的概念11.5.2文件流的建立11.5.3文件流的關(guān)閉11.5.4兩種特殊的文件流11.6字符串流11.6.1字符串流的建立11.6.2字符串流的緩沖區(qū)操作11.7針對(duì)自定義類型重載>>和<<87目錄(續(xù))11.5文件流511.1.1什么是輸入/輸出流C++將數(shù)據(jù)從一個(gè)對(duì)象到另一個(gè)對(duì)象的流動(dòng)抽象為“流”。在程序中,“流”具體體現(xiàn)為一個(gè)對(duì)象,負(fù)責(zé)在數(shù)據(jù)生產(chǎn)者和數(shù)據(jù)消費(fèi)者之間建立聯(lián)系,控制數(shù)據(jù)的流動(dòng)。例如cin、cout就是兩個(gè)流對(duì)象。利用I/O流既可進(jìn)行有格式輸入/輸出,也可進(jìn)行無(wú)格式輸入/輸出。為了實(shí)現(xiàn)格式化的輸出,I/O流類庫(kù)提供了豐富的流操縱符,比如設(shè)置輸出域的寬度,設(shè)置輸出精度,設(shè)置填充字符等。8811.1
C++輸入輸出流的概念11.1.1什么是輸入/輸出流C++將數(shù)據(jù)從一個(gè)對(duì)象到另一11.1.2流類庫(kù)的頭文件<iostream>:
包括istream、ostream、iostream以及cin、cout、ceer和clog對(duì)象的定義,同時(shí)提供非格式化和格式化的I/O服務(wù)。針對(duì)標(biāo)準(zhǔn)設(shè)備的I/O操作,須包含之。<sstream>:
包括istringstream、ostringstream、stringstream的定義,要使用字符串流對(duì)象進(jìn)行針對(duì)內(nèi)存字符串空間的I/O操作,須包含此文件。<fstream>:
包括ifstream、ofstream、fstream的定義,要使用文件流對(duì)象進(jìn)行針對(duì)磁盤(pán)文件的I/O操作,須包含此文件。<iomanip>:
包括setw、fixed等等操縱符的定義,利用操縱符進(jìn)行格式化I/O操作,須包含之。8911.1
C++輸入輸出流的概念11.1.2流類庫(kù)的頭文件<iostream>: 711.11.1.3預(yù)定義流對(duì)象C++中一共有4個(gè)預(yù)定義流對(duì)象,它們的名稱及與之聯(lián)系的I/O設(shè)備如下:cin 標(biāo)準(zhǔn)輸入流對(duì)象,對(duì)應(yīng)標(biāo)準(zhǔn)輸入設(shè)備
cout 標(biāo)準(zhǔn)輸出流對(duì)象,對(duì)應(yīng)標(biāo)準(zhǔn)輸出設(shè)備
cerr 標(biāo)準(zhǔn)錯(cuò)誤信息輸出流對(duì)象,對(duì)應(yīng)標(biāo)準(zhǔn)出錯(cuò)信息輸出設(shè)備
clog 標(biāo)準(zhǔn)錯(cuò)誤信息輸出流對(duì)象,對(duì)應(yīng)帶緩沖的標(biāo)準(zhǔn)出錯(cuò)信息輸出設(shè)備這里提到的標(biāo)準(zhǔn)輸入設(shè)備和標(biāo)準(zhǔn)輸出設(shè)備是操作系統(tǒng)下的兩種虛擬設(shè)備,每種虛擬設(shè)備都與一種具體的設(shè)備相連接。通常情況下,標(biāo)準(zhǔn)輸入設(shè)備與鍵盤(pán)相連接,標(biāo)準(zhǔn)輸出設(shè)備與顯示器相連接,但可以重定向?yàn)榕c其他設(shè)備(如磁盤(pán))。在程序中可以定義自己的流對(duì)象(稱為自定義流對(duì)象),以滿足特定輸入、輸出需求。9011.1
C++輸入輸出流的概念11.1.3預(yù)定義流對(duì)象C++中一共有4個(gè)預(yù)定義流對(duì)象,它11.1.4I/O流庫(kù)的類體系I/O流庫(kù)的類體系C++通過(guò)一系列的流類將不同類型數(shù)據(jù)的輸入/輸出操作封裝起來(lái),以面向?qū)ο蟮姆绞揭?guī)范各種輸入/輸出操作,提供了一套簡(jiǎn)化的操作界面,使得不同類型的數(shù)據(jù)的輸入/輸出可以采用相同的語(yǔ)法格式。部分流類之間的繼承關(guān)系如圖。9111.1
C++輸入輸出流的概念11.1.4I/O流庫(kù)的類體系I/O流庫(kù)的類體系911.111.1.5輸出流舉例一個(gè)輸出流對(duì)象是信息流動(dòng)的目標(biāo),最重要的三個(gè)輸出流是ostream、ostringstream和ofstream。ostream是通用輸出流類,cout、cerr和clog都是它的對(duì)象;ostringstream是字符串輸出流類,它將一片內(nèi)存空間作為輸出設(shè)備;ofstream是文件輸出流類。9211.1
C++輸入輸出流的概念11.1.5輸出流舉例一個(gè)輸出流對(duì)象是信息流動(dòng)的目標(biāo),最重例11-1:向標(biāo)準(zhǔn)設(shè)備輸出字符串#include<iostream>usingnamespacestd;intmain(){
char*word="helloworld!";
doublepi=3.1415926;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職(林業(yè)生產(chǎn)技術(shù))樹(shù)木培育階段測(cè)試題及答案
- 食品管理行業(yè)趨勢(shì)分析
- 紅餐餐飲研究院比薩品類發(fā)展報(bào)告2025
- 病理技術(shù)中級(jí)職稱競(jìng)聘
- 能量的轉(zhuǎn)化與守恒(課件)2025-2026學(xué)年初中物理人教版九年級(jí)全一冊(cè)
- 河南省平頂山魯山縣兩所中學(xué)2025-2026學(xué)年九年級(jí)上學(xué)期期末聯(lián)考道德與法治試卷(含答案)
- 2026北京對(duì)外經(jīng)濟(jì)貿(mào)易大學(xué)科研博士后招聘149人備考題庫(kù)及答案詳解(考點(diǎn)梳理)
- 【試卷】河北省秦皇島市撫寧區(qū)2025-2026學(xué)年九年級(jí)上學(xué)期1月期末道德與法治試題
- 2025年漯河市文化廣電和旅游局所屬事業(yè)單位人才引進(jìn)18名備考題庫(kù)及參考答案詳解1套
- 2025年下半年山東高速集團(tuán)校園招聘339人備考題庫(kù)及答案詳解一套
- 急性呼吸窘迫綜合征ARDS教案
- 實(shí)驗(yàn)室質(zhì)量控制操作規(guī)程計(jì)劃
- 骨科手術(shù)術(shù)前宣教
- 電梯安全培訓(xùn)課件下載
- 事業(yè)單位職工勞動(dòng)合同管理規(guī)范
- 老年人靜脈輸液技巧
- 呼吸內(nèi)科一科一品護(hù)理匯報(bào)
- 2025年公安機(jī)關(guān)人民警察基本級(jí)執(zhí)法資格考試試卷及答案
- 網(wǎng)戀詐騙課件
- 2025版壓力性損傷預(yù)防和治療的新指南解讀
- 2025年新疆第師圖木舒克市公安局招聘警務(wù)輔助人員公共基礎(chǔ)知識(shí)+寫(xiě)作綜合練習(xí)題及答案
評(píng)論
0/150
提交評(píng)論