




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第13章C++輸入/輸出流主要內(nèi)容13.1C++的輸入輸出流13.2標(biāo)準(zhǔn)輸入輸出流13.3文件與文件流13.4應(yīng)用實(shí)例13.1C++的輸入/輸出流1、流的基本概念流:數(shù)據(jù)從一個(gè)對(duì)象流動(dòng)到另一個(gè)對(duì)象,這種流動(dòng)抽象為流。(信息在內(nèi)存和外部設(shè)備之間傳遞(流動(dòng))的過(guò)程)2、輸入/輸出流cin>>a;cout<<a;3、C++流的繼承結(jié)構(gòu)ios:對(duì)流狀態(tài)進(jìn)行設(shè)置,抽象基類(lèi);streambuf:提供對(duì)數(shù)據(jù)的緩沖支持;istream、ostream、iostream:提取與插入iosstreambufistreamostreamiostream4、文件的繼承結(jié)構(gòu)(文件I/O)5、字符串類(lèi)(串I/O)提供處理內(nèi)部初始化字符序列的操作;istrstream:從序列中取字符;ostrstream:將字符放入序列;13.2標(biāo)準(zhǔn)輸入輸出流13.2.1標(biāo)準(zhǔn)輸入流1、預(yù)定義提取符的格式istream&istream::operator>>(type&obj);2、說(shuō)明
輸入語(yǔ)句中可以串聯(lián)多個(gè)提取運(yùn)算符,每個(gè)提取符后為一表達(dá)式,該表達(dá)式是獲得輸入值的變量或?qū)ο?;cin:istream類(lèi)對(duì)象,處理標(biāo)準(zhǔn)輸入,即鍵盤(pán)輸入;提取操作時(shí),空白符(空格、tab鍵、換行符)只用于字符的分隔符,而本身不作為從輸入流中提取的字符;提取符可從輸入流中讀取一個(gè)字符串,該字符串是以空白符結(jié)束的一個(gè)字符序列,由系統(tǒng)自動(dòng)加上'\0'字符;【例13-1】測(cè)試cin的值,遇到無(wú)效字符或者文件結(jié)束符時(shí),輸入流cin就處于出錯(cuò)狀態(tài),同時(shí)判斷流對(duì)象是否處于正常狀態(tài)。#include<iostream>usingnamespacestd;intmain(){intx,y;cout<<"Enterx,y:";cin>>x>>y;cout<<"cin:"<<cin<<endl;if(!cin) {cout<<"error"<<endl;cout<<x<<','<<y<<endl;}else{cout<<"right"<<endl;
cout<<x<<','<<y<<endl;}return0;}運(yùn)行結(jié)果:(1)正常數(shù)據(jù)輸入Enterx,y:37cin:0047B888right3,7(2)異常數(shù)據(jù)輸入Enterx,y:wxcin:00000000error-858993460,-8589934603、使用get()獲取一個(gè)字符intistream::get();istream&istream::get(char&c);istream&get(char*s,intsize,chardelim=‘\n’);4、使用getline()獲取多個(gè)字符istream&istream::getline(char*buf,intLimit,chardelim='\n');說(shuō)明:get()和getline()都是以回車(chē)作為結(jié)束符;從輸入流中讀取Limit-1個(gè)字符后;從輸入流中讀取換行符或其他終止符后;從輸出流中讀取到文件或輸入流結(jié)束符后;getline()通常用來(lái)讀取一行字符;getline()函數(shù)結(jié)束操作的條件:getline()最多可讀取Limit-1個(gè)字符;【例13-3】用getline函數(shù)讀入一行字符。intmain(){charch[20];cout<<"enterasentence:"<<endl;cin>>ch;cout<<"Thestringreadwithcinis:"<<ch<<endl;cin.getline(ch,20,'/');//讀19個(gè)字符或遇'/'結(jié)束
cout<<"Thesecondpartis:"<<ch<<endl;cin.getline(ch,20);//讀20個(gè)字符或遇'\n'結(jié)束
cout<<"Thethirdpartis:"<<ch<<endl;return0;}運(yùn)行結(jié)果:enterasentence:IlikeC++./IstudyC++./Iamhappy.↙Thestringreadwithcinis:IThesecondpartis:likeC++.Thethirdpartis:IstudyC++./Iamh分析:cin.getline()與cin.get(array_name,Arsize)的讀取方式差不多,以Enter結(jié)束,可以接受空格字符。按照長(zhǎng)度(Arsize)讀取字符,cin.getline()會(huì)丟棄結(jié)束符,而cin.get()不會(huì)。cin.get(array_name,Arsize)當(dāng)輸入的字符串超長(zhǎng)時(shí),不會(huì)引起cin函數(shù)的錯(cuò)誤,后面的cin操作會(huì)繼續(xù)執(zhí)行,只是直接從緩沖區(qū)中取數(shù)據(jù)。但是cin.getline()當(dāng)輸入超長(zhǎng)時(shí),會(huì)引起cin函數(shù)的錯(cuò)誤,后面的cin操作將不再執(zhí)行。6、輔助操作
intistream::peek();//返回輸入流中的當(dāng)前字符
istream&istream::putback(char);//將前面用get或者getline函數(shù)從輸入流中讀取的字符返回到輸入流,插入到當(dāng)前指針的位置,供后面讀取
intistream::gcount()//返回上次輸入的字符數(shù)【例13-6】peek函數(shù)和putback函數(shù)的用法。intmain(){ charc; intn; charstr[256]; cout<<"Enteranumberoraword:"; c=cin.get(); if((c>='0')&&(c<='9')) { cin.putback(c); cin>>n; cout<<"Youhaveenterednumber:"<<n<<endl;} else { cin.putback(c); cin>>str; cout<<"Youhaveenteredword:"<<str<<endl;} return0;}13.2.2標(biāo)準(zhǔn)輸出流cout:ostream類(lèi)對(duì)象,處理標(biāo)準(zhǔn)輸出,即屏幕輸出;cerr:ostream類(lèi)對(duì)象,處理標(biāo)準(zhǔn)出錯(cuò)信息,提供不帶緩沖區(qū)的輸出;clog:ostream類(lèi)對(duì)象,處理標(biāo)準(zhǔn)出錯(cuò)信息,提供帶緩沖區(qū)的輸出;三者的區(qū)別:cout:輸出至終端顯示器,經(jīng)由緩沖區(qū),可重定向。cerr:輸出至終端顯示器,沒(méi)有緩沖區(qū),不可重定向。clog:輸出至終端顯示器,經(jīng)由緩沖區(qū),不可重定向。1、預(yù)定義插入符的格式ostream&ostream::operator<<(consttype&obj);2、說(shuō)明一般情況下將插入符作用于cout對(duì)象;輸出語(yǔ)句中可以串聯(lián)多個(gè)插入運(yùn)算符,輸出多個(gè)數(shù)據(jù)項(xiàng);cout:ostream類(lèi)對(duì)象,處理標(biāo)準(zhǔn)輸出,即屏幕輸出;3、其他流成員函數(shù)流成員函數(shù)作用相同的控制符作用precision(n)setprecision(n)設(shè)置實(shí)數(shù)的精度為n位width(n)setw(n)設(shè)置字段寬度為n位fill(c)setfill(c)設(shè)置填充字符csetf()setiosflags()設(shè)置輸出格式狀態(tài)unsetf()resetiosflags()終止已設(shè)置的輸出格式狀態(tài)格式狀態(tài)標(biāo)志說(shuō)明ios::left左對(duì)齊輸出,用于輸出ios::right右對(duì)齊輸出,用于輸出ios::internal在符號(hào)和數(shù)值之間填充字符,用于輸出ios::dec轉(zhuǎn)換基數(shù)為十進(jìn)制,用于輸入或輸出ios::oct轉(zhuǎn)換基數(shù)為八進(jìn)制,用于輸入或輸出ios::hex轉(zhuǎn)換基數(shù)為十六進(jìn)制,用于輸入或輸出ios::showbase輸出時(shí)顯示基指示符(0表示八進(jìn)制,0x或0X表示十六進(jìn)制),用于輸入或輸出ios::showpoint輸出時(shí)顯示小數(shù)點(diǎn),用于輸出ios::uppercase輸出時(shí)表示十六進(jìn)制的x為大寫(xiě),表示浮點(diǎn)數(shù)科學(xué)計(jì)數(shù)法的e為大寫(xiě),用于輸出ios::showpos正整數(shù)前顯示“+”符號(hào),用于輸出ios::scientific用科學(xué)表示法顯示浮點(diǎn)數(shù),用于輸出ios::fixed用定點(diǎn)形式顯示浮點(diǎn)數(shù),用于輸出ios::unitbuf在輸出操作后立即刷新所有流,用于輸出ios::stdio在輸出操作后刷新stdout和stderr,用于輸出【例13-8】用控制符控制輸出格式。intmain(){ inta=10; doubleb=314159.26; cout<<a<<endl;//以十進(jìn)制形式輸出
cout<<setbase(8);//以八進(jìn)制形式輸出
cout<<setiosflags(ios::showbase);//顯示進(jìn)制指示符
cout<<a<<endl; cout<<setprecision(7);//設(shè)置精度為7位
cout<<b<<endl; cout<<setiosflags(ios::fixed);//設(shè)置以固定小數(shù)點(diǎn)方式輸出
cout<<setprecision(4);//設(shè)置小數(shù)點(diǎn)后保留4位
cout<<b<<endl;
//設(shè)置以指數(shù)形式輸出,同時(shí)字母大寫(xiě)且左對(duì)齊 cout<<setiosflags(ios::scientific|ios::uppercase|ios::left); cout<<setw(20);//設(shè)置顯示域?qū)挒?0 cout<<setfill('*');//空白處以'*'填充
cout<<-b<<endl;//以負(fù)數(shù)方式輸出
//取消指數(shù)形式輸出,同時(shí)字母大寫(xiě)且左對(duì)齊的設(shè)置
cout<<resetiosflags(ios::scientific|ios::uppercase|ios::left); cout<<setfill('');//空白處以''填充 cout<<setprecision(6); cout<<setw(20); cout<<b<<endl; return0;}運(yùn)行結(jié)果10(以十進(jìn)制形式輸出)012(以八進(jìn)制形式輸出,且顯示進(jìn)制指示符)314159.3(設(shè)置精度為7位)314159.2600(以固定小數(shù)點(diǎn)形式輸出,小數(shù)點(diǎn)后保留4位)-3.142E+005*********(以指數(shù)形式左對(duì)齊輸出,域?qū)挒?0,空白處以'*'填充)314159.260000(域?qū)挒?0,小數(shù)點(diǎn)后保留6位,空白處以''填充)4、使用put()輸出一個(gè)字符ostream&ostream::put(charc);5、使用write()輸出n個(gè)字符ostream&ostream::write(char*buf,intn);說(shuō)明:這些成員函數(shù)既可用于文本流,也可用于二進(jìn)制流,尤其適用于二進(jìn)制流;[例]分析下列程序的輸出結(jié)果。#include<iostream>usingnamespacestd;voidmain(){cout<<'a'<<','<<'b'<<'\n';cout.put('a').put(',').put('b').put('\n');charc1='A',c2='B';cout.put(c1).put(c2).put('\n');}運(yùn)行結(jié)果:a,ba,bAB[例]分析下列程序的輸出結(jié)果。#include<iostream>usingnamespacestd;voidprint(char*s){cout.write(s,strlen(s));cout.put('\n');cout.write(s,6)<<'\n';}voidmain(){char*str="ILoveChina!";print(str);}運(yùn)行結(jié)果:ILoveChina!ILove13.3文件與文件流13.3.1文件的類(lèi)型1、文件的概念
在磁盤(pán)上保存的信息是按文件的形式組織的,每個(gè)文件都對(duì)應(yīng)一個(gè)文件名,并且屬于某個(gè)物理盤(pán)或邏輯盤(pán)的目錄層次結(jié)構(gòu)中一個(gè)確定的目錄之下。一個(gè)文件名由文件主名和擴(kuò)展名兩部分組成。2、文件的類(lèi)型
按存儲(chǔ)格式分為兩種類(lèi)型,一種為字符格式文件(文本文件),另一種為內(nèi)部字節(jié)文件(二進(jìn)制文件)。文件的類(lèi)型根據(jù)文件中數(shù)據(jù)的組織形式,可分為ASCII文件和二進(jìn)制文件。對(duì)于字符信息,在內(nèi)存中是以ASCII代碼形式存放的,因此,無(wú)論用ASCII文件輸出還是用二進(jìn)制文件輸出,其數(shù)據(jù)形式是一樣的。但是對(duì)于數(shù)值數(shù)據(jù),二者是不同的。例如有一個(gè)長(zhǎng)整數(shù)100000,在內(nèi)存中占4個(gè)字節(jié),如果按內(nèi)部格式直接輸出,在磁盤(pán)文件中占4個(gè)字節(jié),如果將它轉(zhuǎn)換為ASCII碼形式輸出,則要占6個(gè)字節(jié)。長(zhǎng)整數(shù)100000
‘1’
‘0’
‘0’
‘0’
‘0’
‘0’
3、文件流對(duì)象要用#include<fstream>命令。它提供的輸入文件流類(lèi):ifstream輸出文件流類(lèi):ofstream輸入輸出文件流類(lèi):fstream定義用戶所需要的文件流對(duì)象,然后利用open成員函數(shù),按照一定的方式打開(kāi)一個(gè)文件。文件被打通過(guò)流對(duì)象訪問(wèn)其中內(nèi)容,結(jié)束后用close關(guān)閉。13.3.2文件流的操作說(shuō)明一個(gè)文件流對(duì)象,然后進(jìn)行操作:ifstreamifile;//說(shuō)明一個(gè)輸入流對(duì)象ofstreamofile;//說(shuō)明一個(gè)輸出流對(duì)象fstreamiofile;//說(shuō)明一個(gè)輸入/輸出流對(duì)象1.打開(kāi)磁盤(pán)文件打開(kāi)文件是指在文件讀寫(xiě)之前做必要的準(zhǔn)備工作包括:(1)為文件流對(duì)象和指定的磁盤(pán)文件建立關(guān)聯(lián),以便使文件流流向指定的磁盤(pán)文件。(2)指定文件的工作方式。以上工作可以通過(guò)兩種不同的方法實(shí)現(xiàn)。打開(kāi)文件(1)使用文件流對(duì)象的成員函數(shù)(open)打開(kāi)一個(gè)磁盤(pán)文件,在文件流對(duì)象和磁盤(pán)文件名之間建立聯(lián)系。ofstreamoutfile;//定義ofstream類(lèi)對(duì)象outfileoutfile.open(″f1.txt″,ios::out);//使文件流與f1.txt文件建立關(guān)聯(lián)open()函數(shù)的原型voidopen(constchar*filename,intmode,
intprot=filebuf::openprot);相關(guān)參數(shù)說(shuō)明:Filename:文件名,它可包含路徑說(shuō)明。Mode:文件打開(kāi)的模式Prot:文件的訪問(wèn)方式,取值為:
0普通文件1只讀文件
2隱含文件4系統(tǒng)文件
(默認(rèn)為0)
對(duì)于ifstream流,mode的默認(rèn)值為ios::in;對(duì)于ofstream流,mode的默認(rèn)值為ios::out。方式意義ios::in打開(kāi)文件進(jìn)行讀操作ios::out打開(kāi)文件進(jìn)行寫(xiě)操作ios::ate打開(kāi)時(shí)文件指針定位到文件尾ios::app添加模式,所有增加都在文件尾部ios::trunc如果文件已存在則清空原文件ios::binary二進(jìn)制文件(非文本文件)mode的符號(hào)常量可以“|”組合在一起例:ofstreamoutfile;outfile.open(“f1.txt”,ios::out|ios::app);fstreamfile;file.open(“f2.txt”,ios::in|ios::out|ios::binary);打開(kāi)文件(2)在定義文件流對(duì)象時(shí)指定參數(shù)在聲明文件流類(lèi)時(shí)定義了帶參數(shù)的構(gòu)造函數(shù),其中包含了打開(kāi)磁盤(pán)文件的功能。因此,可以在定義文件流對(duì)象時(shí)指定參數(shù),調(diào)用文件流類(lèi)的構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)打開(kāi)文件的功能。如 ofstreamoutfile(″f1.txt″,ios::out);一般多用此形式,比較方便。作用與open函數(shù)相同。輸入輸出方式是在ios類(lèi)中定義的,它們是枚舉常量,有多種選擇,見(jiàn)書(shū)中表13-5。2.關(guān)閉磁盤(pán)文件在對(duì)已打開(kāi)的磁盤(pán)文件的讀寫(xiě)操作完成后,應(yīng)關(guān)閉該文件。關(guān)閉文件用成員函數(shù)close。如:outfile.close();所謂關(guān)閉,實(shí)際上是解除該磁盤(pán)文件與文件流的關(guān)聯(lián),原來(lái)設(shè)置的工作方式也失效,這樣,就不能再通過(guò)文件流對(duì)該文件進(jìn)行輸入或輸出。3.文件的讀寫(xiě)文本文件的讀寫(xiě)二進(jìn)制文件的讀寫(xiě)13.3.3文本文件的讀寫(xiě)操作(1)使用流運(yùn)算符直接讀寫(xiě)可以直接使用流的“<<”和“>>”,完成文件的字符轉(zhuǎn)換工作。(2)使用流成員函數(shù) 輸出流成員函數(shù)為:put函數(shù)
輸入流成員函數(shù)有:get函數(shù)、getline函數(shù)【例13-10】把整型數(shù)組的所有元素寫(xiě)入文本文件中存放。#include<iostream>#include<fstream>usingnamespacestd;intmain(){ //創(chuàng)建文件流對(duì)象,并以輸出方式與try.txt文件建立關(guān)聯(lián)
fstreamf("d:\\try.txt",ios::out); f<<1234<<''<<3.14<<'A'<<"Howareyou";//往文件中寫(xiě)入數(shù)據(jù)
f.close(); //關(guān)閉文件
f.open("d:\\try.txt",ios::in);//以輸入方式與try.txt文件建立關(guān)聯(lián) inti; doubled; charc; chars1[20]; chars2[20]; f>>i>>d>>c>>s1; //從文件中讀取數(shù)據(jù)
f.getline(s2,20); cout<<i<<endl;//在顯示器上顯示讀取到的數(shù)據(jù)
cout<<d<<endl; cout<<c<<endl; cout<<s1<<endl; cout<<s2<<endl; f.close(); return0;}【例13-11】從鍵盤(pán)讀入一行字符,把其中的數(shù)字依次存放在文件number.txt中。再?gòu)奈募umber.txt中讀入5個(gè)整數(shù)放在數(shù)組中,找出并輸出5個(gè)數(shù)中的最大者和它在數(shù)組中的序號(hào)。voidsave_to_file(){ ofstreamoutfile(“number.txt”); if(!outfile)
{ cerr<<"opennumber.txterror!"<<endl; exit(1); } charc[80]; cin.getline(c,80);//從鍵盤(pán)讀入一行字符 for(inti=0;c[i]!=0;i++)//對(duì)字符逐個(gè)處理,直到遇'\0'為止
if(c[i]>='0'&&c[i]<='9')
{ outfile.put(c[i]).put('');//存入文件 cout<<c[i];//同時(shí)送顯示器顯示
} cout<<endl; outfile.close();//關(guān)閉number.txt}voidget_from_file(){ constintLEN=5; inta[LEN],max,i,order; ifstreaminfile("number.txt",ios::in);
if(!infile)
{ cerr<<"opennumber.txterror!"<<endl;
exit(1);
} for(i=0;i<LEN;i++)
{
infile>>a[i];
cout<<a[i]<<"";
} cout<<endl; max=a[0];//先將第1個(gè)數(shù)組元素(下標(biāo)為0)賦給max order=0;//記錄下標(biāo)
for(i=1;i<LEN;i++) if(a[i]>max) { max=a[i];//將當(dāng)前最大值放在max中
order=i;//將當(dāng)前最大值的元素序號(hào)放在order中
} cout<<"max="<<max<<endl<<"order="<<order<<endl; infile.close();}intmain(){ save_to_file(); get_from_file(); return0;}13.3.4二進(jìn)制文件的讀寫(xiě)操作1、用write()往文件寫(xiě)入n個(gè)字節(jié)原型:ostream&ostream::write(char*buf,intn);2、用read()從文件讀取n個(gè)字節(jié)原型:istream&istream::read(char*buf,intn);structperson{charname[20];doubleheight;intage;};personpeople[6];//假設(shè)數(shù)組已經(jīng)賦值outfile.write((char*)
&people[i],sizeof(people[i]));【例13-12】編寫(xiě)一個(gè)程序?qū)ΧM(jìn)制文件進(jìn)行讀寫(xiě)。要求從鍵盤(pán)輸入若干學(xué)生的信息寫(xiě)入二進(jìn)制文件,再?gòu)脑摱M(jìn)制文件中讀出學(xué)生的信息到內(nèi)存中并輸出到顯示器。#include<iostream>#include<fstream>usingnamespacestd;structStudent//定義Student結(jié)構(gòu)體類(lèi)型{ charname[10];//姓名
charid[10];//學(xué)號(hào)
intscore;//分?jǐn)?shù)};#defineLENsizeof(structStudent)intmain()
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 茶鮮葉收購(gòu)合同范本
- 選礦訂貨合同范本
- 衛(wèi)生巾銷(xiāo)售合同范本
- 供熱入網(wǎng)合同范本
- 合作樓盤(pán)合同范本
- 醫(yī)院欠款合同范例
- 勞務(wù)派遣員工項(xiàng)目合同范本
- 吉林勞務(wù)合同范本
- 創(chuàng)意策劃服務(wù)合同范本
- 廠服定制服務(wù)合同范本
- 腦筋急轉(zhuǎn)彎大全及答案 (500題)
- 2023年常州市新課結(jié)束考試九年級(jí)數(shù)學(xué)試卷(含答案)
- 汽車(chē)動(dòng)力學(xué)輪胎動(dòng)力學(xué)
- 水產(chǎn)動(dòng)物遺傳與育種學(xué)緒論
- GB/T 2091-2008工業(yè)磷酸
- 監(jiān)理表格.監(jiān)理.3.復(fù)工令
- 二年級(jí)下冊(cè)科學(xué)考點(diǎn)歸納
- 人教版三年級(jí)音樂(lè)上冊(cè)《口風(fēng)琴教學(xué)》課件
- 小學(xué)英語(yǔ)《The Magic Words》優(yōu)質(zhì)教學(xué)課件
- DBJ50-T-398-2021 城軌快線施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 港口危險(xiǎn)貨物安全管理人員機(jī)考試題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論