版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章流處理5.1C++流的概念
5.2輸入/輸出流
5.3輸入/輸出的格式控制
5.4文件操作
5.5字符串流
本章小結(jié)習(xí)題
為程序設(shè)計(jì)語言提供一種通用的輸入/輸出(I/O)功能是一項(xiàng)困難的工作。按照傳統(tǒng),I/O功能完全是為了處理幾種基本數(shù)據(jù)類型而設(shè)計(jì)的。任何不平凡的C++?都會使用到許多用戶自定義類型,因此就必須處理這些類型的輸入/輸出問題。如果能把所有平常的“容器”——標(biāo)準(zhǔn)的I/O函數(shù)、文件以及內(nèi)存塊看做同樣的對象,使用同樣的接口進(jìn)行操作,這樣不是很好嗎?
C++的設(shè)計(jì)就是要用戶可以定義新類型,使這些自定義的類型的使用跟內(nèi)部類型一樣方便而有效。一種I/O機(jī)制應(yīng)該是簡單的、方便的、使用起來安全的、有效而靈活的,當(dāng)然最重要的應(yīng)該是完整的。因此,就應(yīng)該使用戶有可能提供另外的I/O機(jī)制,并有可能去擴(kuò)充標(biāo)準(zhǔn)I/O功能,以適應(yīng)特定應(yīng)用的需求。在C++里,應(yīng)該只用每個(gè)程序員都能用的那些機(jī)制為C++提供一種I/O機(jī)制。下面首先介紹流的概念,再詳細(xì)介紹面向標(biāo)準(zhǔn)設(shè)備的輸入流和輸出流、對文件操作的文件流以及字符串流。5.1C++?流的概念在C++?程序設(shè)計(jì)中,流表示一系列流動(dòng)的數(shù)據(jù),就像水流一樣,有連續(xù)不斷的意思。流的一個(gè)主要特征就是單向的,一個(gè)輸入/輸出流是一系列向某個(gè)方向移動(dòng)的字節(jié)或字符。在程序設(shè)計(jì)中經(jīng)常要用到的流是標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出,文件也被看做流。通常是將一個(gè)文件流從磁盤讀入內(nèi)存,或?qū)⒁粋€(gè)文件流寫入磁盤。流是對輸入/輸出、字符串和文件的操作統(tǒng)一起來而抽象的一個(gè)概念,以方便對這些對象的操作。它們的共同特征就是可以連續(xù)不斷地處理對象。C++?的輸入/輸出流類庫主要有三種類型的流:控制臺、磁盤文件和字符串流。讀者可以獲得一個(gè)輸入流(通過istream類或其子類對象)、一個(gè)輸出流(ostream類或其子類對象)或同時(shí)實(shí)現(xiàn)兩種功能的流(使用iostream或其子類對象)。C++的輸入/輸出由標(biāo)準(zhǔn)庫提供。標(biāo)準(zhǔn)庫定義了一組類,支持對文件和控制窗口等設(shè)備的讀/寫(I/O)。還可以讀/寫存儲在內(nèi)存中的string對象,使string對象能夠像文件一樣操作,從而使我們無須I/O就能實(shí)現(xiàn)數(shù)據(jù)與字符的轉(zhuǎn)換。此外,一般來說,類的設(shè)計(jì)者還可以很方便地使用I/O標(biāo)準(zhǔn)庫設(shè)施讀/寫自定義類的對象。三種I/O類在各自獨(dú)立的頭文件中定義:iostream定義讀/寫控制窗口的類型,fstream定義讀/寫已命名文件的類型,而sstream所定義的類型則用于讀/寫存儲在內(nèi)存中的string對象。
類繼承層次如圖5.1所示。
C++的I/O類主要在iostream、fstream和sstream三個(gè)頭文件中定義。iostream包括istream(從流中讀取)、ostream(寫到流中)及iostream(對流進(jìn)行讀/寫)。fstream包括ifstream(從文件中讀取,由istream派生而來)、ofstream(寫到文件中,由ostream派生而來)及fstream(讀/寫文件,由iostream派生而來)。sstream包括istringstream(從string對象中讀取,由istream派生而來)、ostringstream(寫到string對象中,由ostream派生而來)及stringstream(對string對象進(jìn)行讀/寫,由iostream派生而來)。所有的這些流類擁有幾乎相同的接口,所以能夠以統(tǒng)一的方式使用這些流類,不管操作的是文件、標(biāo)準(zhǔn)I/O、內(nèi)存區(qū)還是string對象。下面分別對這三種流對象進(jìn)行詳細(xì)的介紹。圖5.1簡單的iostream繼承層次5.2輸入/輸出流5.2.1龐大的I/O類庫
C++語言系統(tǒng)為實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出定義了一個(gè)龐大的類庫,它包括的類主要有ios、istream、ostream、iostream、ifstream、ofstream、fstream、istrstream、ostrstream、strstream等,其中ios為根基類,其余都是它的直接或間接派生類。
ios直接派生四個(gè)類:輸入流類istream、輸出流類ostream、文件流基類fstreambase和字符串流基類strstreambase。輸入文件流類同時(shí)繼承了輸入流類和文件流基類(當(dāng)然對于根基類是間接繼承);輸出文件流類ofstream同時(shí)繼承了輸出流類和文件流基類;輸入字符串流類istrstream同時(shí)繼承了輸入流類和字符串流基類;輸出字符串流類ostrstream同時(shí)繼承了輸出流類和字符串流基類;輸入/輸出流類iostream同時(shí)繼承了輸入流類和輸出流類;輸入/輸出文件流類fstream同時(shí)繼承了輸入/輸出流類和文件流基類;輸入/輸出字符串流類strstream同時(shí)繼承了輸入/輸出流類和字符串流基類。5.2.2預(yù)定義流對象cincin是istream流類的對象,它默認(rèn)的輸入是鍵盤,它在頭文件iostream.h中作為全局對象定義:
istreamcin(stdin)//標(biāo)準(zhǔn)設(shè)備名作為其構(gòu)造時(shí)的參數(shù)
istream流類對應(yīng)每個(gè)基本數(shù)據(jù)類型都有友元,它們在iostream.h中聲明:istream&operator>>(istream&dest,char*pSource);
istream&operator>>(istream&dest,intsource);
istream&operator>>(istream&dest,charsource);
//…
因此,如果在程序中使用cin、cout和流運(yùn)算符,就必須使用預(yù)處理命令把頭文件stream包含到本文件中:
#include<iostream>cin最常用的方法是使用右移運(yùn)算符(>>),它是被重載以簡化輸入流的使用,即istream類從此運(yùn)算符中獲取輸入。運(yùn)算符>>被稱為提取符。cin語句的一般格式為
cin>>變量1>>變量2>>…>>變量n;
例如,下面的代碼將隨后的三個(gè)數(shù)字輸入并給變量x、y、z賦值:
#include<iostream.h>intx,y,z;cin>>x>>y>>z;
假設(shè)用戶從鍵盤上輸入了以下三個(gè)數(shù):
123445
在這種情況下,程序?qū)?shù)12、34、45分別賦值給x、y、z。如同所有的istream實(shí)例,以這種方式輸入的數(shù)字必須用一個(gè)或多個(gè)空白字符分隔,如空格符、制表符和換行符。
提取符按照目標(biāo)對象的類型解析輸入信息。如下所示:
inti;cin>>i;
floatf;cin>>f;charc;cin>>c;charbuf[32];cin>>buf;
所有的內(nèi)置數(shù)據(jù)類型都重載了operator>>。讀者自己也可以重載operator>>。大多數(shù)簡單的C++?程序使用cin來進(jìn)行輸入操作。有時(shí)需要對輸入操作有更多要求,比如一次讀入一行或每次讀入一個(gè)字符,這時(shí)可以用I/O流成員函數(shù)。為了讀取一行文本,可以使用getline成員函數(shù),其函數(shù)原型為:
getline(char*line,intsize,char='\n');
第一個(gè)參數(shù)是字符數(shù)組,用于放置讀取的文本,第二個(gè)參數(shù)是本次讀取的最大字符個(gè)數(shù),第三個(gè)參數(shù)是分隔字符,作為讀取一行結(jié)束的標(biāo)志。例如,下面的函數(shù)從鍵盤上讀取一行文本:
charstr[256];cin.getline(str,sizeof(str));
在默認(rèn)狀態(tài),getline成員函數(shù)讀字符直到回車,或者讀到指定的字符數(shù)。有時(shí)需要每次輸入一個(gè)字符,這時(shí)就可以使用get()成員函數(shù)。其格式為:
charistream::get();
例如,下面的函數(shù)每次讀入一個(gè)字符:
charletter:letter=cin.get();
使用流成員函數(shù)和提取符?>>?不只限于標(biāo)準(zhǔn)輸入鍵盤,還可以是文件或字符流,在后面我們還會看到它的用法。5.2.3預(yù)定義流對象cout、cerr和clogcout是ostream流類的對象,它在頭文件iostream.h中作為全局對象定義:
ostreamcout(stdout);//stdout是標(biāo)準(zhǔn)輸出設(shè)備名
ostream流類對應(yīng)每個(gè)基本數(shù)據(jù)類型都有友元,它們在iostream.h中聲明:
ostream&operator<<(ostream&dest,char*pSource);ostream&operator<<(ostream&dest,intsource);ostream&operator<<(ostream&dest,charsource);
因此,如果在程序中使用cin、cout和流運(yùn)算符,就必須使用預(yù)處理命令把頭文件stream包含到本文件中:
#include<iostream>cout通常是和左移運(yùn)算符(<<)一起使用的,即ostream對象向運(yùn)算符發(fā)送輸出。左移運(yùn)算符又被稱為插入符,它是被重載過了的。
cout語句的一般格式為
cout<<表達(dá)式1<<表達(dá)式2<<…<<表達(dá)式n;
例如,以下代碼輸出一個(gè)數(shù)a和一個(gè)字符串str,以及其他文字:
#include<iostream.h>inta=20;stringstr="thisisatest";//…cout<<"Thevalueofais"<<a<<endl;cout<<"Thestringis"<<str<endl;
除了標(biāo)準(zhǔn)輸入/輸出設(shè)備,還有標(biāo)準(zhǔn)錯(cuò)誤設(shè)備cerr和clog,它們都是ostream類的一個(gè)實(shí)例。它們都和顯示器相關(guān)聯(lián),通常等同于標(biāo)準(zhǔn)輸出(cout)。和cout的區(qū)別是,盡管標(biāo)準(zhǔn)輸出可被重定向?yàn)橐粋€(gè)文件,而cerr和clog始終將信息在顯示器上顯示。cerr和clog的差別是,cerr流直接向顯示器發(fā)送非緩沖的輸出,而clog采用經(jīng)緩沖的輸出。clog和cerr都是顯示錯(cuò)誤信息的好辦法,因?yàn)闊o論標(biāo)準(zhǔn)輸出是否被重定向,它們都向屏幕顯示。例如,以下代碼向顯示器發(fā)送一條出錯(cuò)信息:
cerr<<"Youenterthewrongnumber";cerr<<error_number<<endl;
下面舉一個(gè)完整的例子來說明上述幾個(gè)流對象的用法。
#include<iostream>usingnamespacestd;intmain(){ inti,j;
cout<<"Pleaseinputanumber."<<endl; cin>>i; cout<<"Pleaseinputanothernumber."<<endl; cin>>j;cout<<"i="<<i<<endl; cout<<"j="<<j<<endl; cout<<"i+j="<<i+j<<endl;
if(j==0) cerr<<"thejiszero,cannotbedivided."<<endl; else cout<<"i/j="<<i/j<<endl;
return0;}
從鍵盤輸入兩個(gè)數(shù),求它們的和并輸出,然后判斷第二個(gè)數(shù)是否為零,如果為零則不能相除,否則就輸出它們的商。5.3輸入/輸出的格式控制上節(jié)介紹的是使用cout和cin時(shí)的默認(rèn)格式。但有時(shí)人們在輸入/輸出時(shí)有格式要求,如在輸出時(shí)規(guī)定字段寬度,保留小數(shù)的位數(shù),數(shù)據(jù)向左或向右對齊等。C++有兩種方法控制格式的輸出,一種是使用流對象的成員函數(shù),另一種是使用格式控制符,下面分別介紹。5.3.1ios類中的枚舉常量在根基類ios中定義有三個(gè)用戶需要使用的枚舉類型,由于它們是在公用成員部分定義的,因此其中的每個(gè)枚舉類型常量在加上ios::?前綴后都可以為本類成員函數(shù)和所有外部函數(shù)訪問。在三個(gè)枚舉類型中有一個(gè)無名枚舉類型,其中定義的每個(gè)枚舉常量都是用于設(shè)置控制輸入/輸出格式的標(biāo)志使用的。該枚舉類型定義如下:
enum{skipws,left,right,internal,dec,oct,hex,showbase,showpoint,uppercase,showpos,scientific,fixed,unitbuf,stdio};
各枚舉常量的含義如下:
skipws:利用它設(shè)置對應(yīng)標(biāo)志后,從流中輸入數(shù)據(jù)時(shí)跳過當(dāng)前位置及后面的所有連續(xù)的空白字符,從第一個(gè)非空白字符起讀數(shù),否則不跳過空白字符。空格、制表符'\t'、回車符'\r'和換行符?'\n'?統(tǒng)稱為空白符。left,right,internal:left在指定的域?qū)拑?nèi)按左對齊輸出,right按右對齊輸出,而internal使數(shù)值的符號按左對齊、數(shù)值本身按右對齊輸出。域?qū)拑?nèi)剩余的字符位置用填充符填充。缺省為right設(shè)置。在任一時(shí)刻只有一種有效。
dec,oct,hex:設(shè)置dec對應(yīng)標(biāo)志后,使以后的數(shù)值按十進(jìn)制輸出,設(shè)置oct后按八進(jìn)制輸出,而設(shè)置hex后則按十六進(jìn)制輸出。缺省為dec設(shè)置。
showbase:設(shè)置對應(yīng)標(biāo)志后使數(shù)值輸出的前面加上基指示符,八進(jìn)制數(shù)的基指示符為數(shù)字0,十六進(jìn)制數(shù)的基指示符為0x,十進(jìn)制數(shù)沒有基指示符。缺省為不設(shè)置,即在數(shù)值輸出的前面不加基指示符。showpoint:強(qiáng)制輸出的浮點(diǎn)數(shù)中帶有小數(shù)點(diǎn)和小數(shù)尾部的無效數(shù)字0。缺省為不設(shè)置。
uppercase:使輸出的十六進(jìn)制數(shù)和浮點(diǎn)數(shù)中使用的字母為大寫。缺省為不設(shè)置,即輸出的十六進(jìn)制數(shù)和浮點(diǎn)數(shù)中使用的字母為小寫。
showpos:使輸出的正數(shù)前帶有正號“+”。缺省為不設(shè)置,即輸出的正數(shù)前不帶任何符號。
scientific,fixed:進(jìn)行scientific設(shè)置后使浮點(diǎn)數(shù)按科學(xué)表示法輸出,進(jìn)行fixed設(shè)置后使浮點(diǎn)數(shù)按定點(diǎn)表示法輸出。只能任設(shè)其一。缺省時(shí)由系統(tǒng)根據(jù)輸出的數(shù)值選用合適的表示輸出。unitbuf,stdio:這兩個(gè)常量很少使用,所以不予介紹。在ios中定義的第二個(gè)枚舉類型為:
enumopen_mode{in,out,ate,app,trunc,nocreate,noreplace,binany};
其中的每個(gè)枚舉常量規(guī)定一種文件打開的方式,在定義文件流對象和打開文件時(shí)使用。在ios中定義的第三個(gè)枚舉類型為:
enumseek_dir{beg,cur,end};
其中的每個(gè)枚舉常量用于對文件指針的定位操作上。5.3.2ios類中的成員函數(shù)
ios類提供成員函數(shù)對流的狀態(tài)進(jìn)行檢測和進(jìn)行輸入/輸出格式控制等操作,每個(gè)成員函數(shù)的聲明格式和簡要說明如下:
intbad();操作出錯(cuò)時(shí)返回非0值。
inteof();讀取到流中最后的文件結(jié)束符時(shí)返回非0值。
intfail();操作失敗時(shí)返回非0值。
voidclear();清除bad、eof和fail所對應(yīng)的標(biāo)志狀態(tài),使之恢復(fù)為正常狀態(tài)值0,使good標(biāo)志狀態(tài)恢復(fù)為1。
charfill();返回當(dāng)前使用的填充字符。
charfill(charc);重新設(shè)置流中用于輸出數(shù)據(jù)的填充字符為c的值,返回此前的填充字符。系統(tǒng)預(yù)設(shè)置填充字符為空格。longflags();返回當(dāng)前用于I/O控制的格式狀態(tài)字。
longflags(longf);重新設(shè)置格式狀態(tài)字為f的值,返回此前的格式狀態(tài)字。
intgood();操作正常時(shí)返回非0值,當(dāng)操作出錯(cuò)、失敗和讀到文件結(jié)束符時(shí)均為不正常,則返回0。
intprecision();返回浮點(diǎn)數(shù)輸出精度,即輸出的有效數(shù)字的位數(shù)。
intprecision(intn);設(shè)置浮點(diǎn)數(shù)的輸出精度為n,返回此前的輸出精度。系統(tǒng)預(yù)設(shè)置的輸出精度為6,即輸出的浮點(diǎn)數(shù)最多具有6位有效數(shù)字。
intrdstate();操作正常時(shí)返回0,否則返回非0值,它與good()正好相反。longsetf(longf);根據(jù)參數(shù)f設(shè)置相應(yīng)的格式化標(biāo)志,返回此前的設(shè)置。參數(shù)f所對應(yīng)的實(shí)參為無名枚舉類型中的枚舉常量(又稱格式化常量),可以同時(shí)使用一個(gè)或多個(gè)常量,每兩個(gè)常量之間要用按位或操作符連接。如當(dāng)需要左對齊輸出,并使數(shù)值中的字母大寫時(shí),則調(diào)用該函數(shù)的實(shí)參為ios::left|ios::uppercase。
longunsetf(longf);根據(jù)參數(shù)f清除相應(yīng)的格式化標(biāo)志,返回此前的設(shè)置。如要清除此前的左對齊輸出設(shè)置,恢復(fù)缺省的右對齊輸出設(shè)置,則調(diào)用該函數(shù)的實(shí)參為ios::left。
intwidth();返回當(dāng)前的輸出域?qū)?。若返回?cái)?shù)值0,則表明沒有為剛才輸出的數(shù)值設(shè)置輸出域?qū)?,輸出域?qū)捠侵篙敵龅闹翟诹髦兴加械淖止?jié)數(shù)。intwidth(intw);設(shè)置下一個(gè)數(shù)據(jù)值的輸出域?qū)挒閣,返回為輸出上一個(gè)數(shù)據(jù)值所規(guī)定的域?qū)?,若無規(guī)定則返回0。注意:此設(shè)置不是一直有效,而只是對下一個(gè)輸出數(shù)據(jù)有效。因?yàn)樗蠭/O流類都是ios的派生類,所以它們的對象都可以調(diào)用ios類中的成員函數(shù)和使用ios類中的格式化常量進(jìn)行輸入/輸出格式控制。下面以標(biāo)準(zhǔn)輸出流對象cout為例說明輸出的格式化控制。
【程序5.1】#include<iostream.h>//usingnamespacestd;intmain(){intx=50,y=500,z=2048;cout<<x<<''<<y<<''<<z<<endl; //按十進(jìn)制輸出
cout.setf(ios::oct); //設(shè)置為八進(jìn)制輸出
cout<<x<<''<<y<<''<<z<<endl; //按八進(jìn)制輸出
cout.unsetf(ios::oct); //取消八進(jìn)制輸出設(shè)置,恢復(fù)按十進(jìn)制輸出
cout.setf(ios::hex); //設(shè)置為十六進(jìn)制輸出cout<<x<<''<<y<<''<<z<<endl; //按十六進(jìn)制輸出
cout.setf(ios::showbase|ios::uppercase);//設(shè)置基指示符輸出和數(shù)值中的字母大寫輸出
cout<<x<<''<<y<<''<<z<<endl;cout.unsetf(ios::showbase|ios::uppercase);//取消基指示符輸出和數(shù)值中的字母大寫輸出
cout<<x<<''<<y<<''<<z<<endl;cout.unsetf(ios::hex);//取消十六進(jìn)制輸出設(shè)置,恢復(fù)按十進(jìn)制輸出
cout<<x<<''<<y<<''<<z<<endl;return0;}
運(yùn)行結(jié)果如下:【程序5.2】#include<iostream>usingnamespacestd;intmain(){intx=564;doubley=-6.635163;cout<<"x=";cout.width(10); //設(shè)置輸出下一個(gè)數(shù)據(jù)的域?qū)挒?0cout<<x; //按缺省的右對齊輸出,剩余位置填充空格字符
cout<<"y=";cout.width(10); //設(shè)置輸出下一個(gè)數(shù)據(jù)的域?qū)挒?0cout<<y<<endl;cout.setf(ios::left); //設(shè)置按左對齊輸出
cout<<"x=";cout.width(10);cout<<x;cout<<"y=";cout.width(10);cout<<y<<endl;cout.fill('*'); //設(shè)置填充字符為'*'cout.precision(3); //設(shè)置浮點(diǎn)數(shù)輸出精度為3cout.setf(ios::showpos); //設(shè)置正數(shù)的正號輸出
cout<<"x=";cout.width(10);cout<<x;cout<<"y=";cout.width(10);cout<<y<<endl;return0;}
運(yùn)行結(jié)果如下:【程序5.3】#include<iostream>usingnamespacestd;intmain(){floatx=87,y=-6.298;cout<<x<<''<<y<<endl;cout.setf(ios::showpoint); //強(qiáng)制顯示小數(shù)點(diǎn)和無效0cout<<x<<''<<y<<endl;cout.unsetf(ios::showpoint);//恢復(fù)缺省輸出
cout.setf(ios::scientific); //設(shè)置按科學(xué)表示法輸出cout<<x<<''<<y<<endl;cout.setf(ios::fixed); //設(shè)置按定點(diǎn)表示法輸出
cout<<x<<''<<y<<endl;return0;}
運(yùn)行結(jié)果如下:5.3.3格式控制操作符數(shù)據(jù)輸入/輸出的格式控制還有更簡便的形式,即使用系統(tǒng)頭文件iomanip.h中提供的操作符。使用這些操作符不需要調(diào)用成員函數(shù),只要把它們作為插入操作符<<(個(gè)別作為提取操作符>>)的輸出對象即可。需要注意的是,如果使用了操作符,在程序單位的開頭除了要加頭文件iostream外,還要加頭文件iomanip。這些操作符及功能如下:
dec:轉(zhuǎn)換為按十進(jìn)制輸出整數(shù),它也是系統(tǒng)預(yù)置的進(jìn)制。
oct:轉(zhuǎn)換為按八進(jìn)制輸出整數(shù)。
hex:轉(zhuǎn)換為按十六進(jìn)制輸出整數(shù)。
ws:從輸入流中讀取空白字符。endl:輸出換行符?'\n'?并刷新流。刷新流是指把流緩沖區(qū)的內(nèi)容立即寫入到對應(yīng)的物理設(shè)備上。
ends:輸出一個(gè)空字符?'\0'。
flush:只刷新一個(gè)輸出流。
setiosflags(longf):設(shè)置f所對應(yīng)的格式化標(biāo)志,功能與成員函數(shù)setf(longf)相同,當(dāng)然輸出該操作符后返回的是一個(gè)輸出流。如果采用標(biāo)準(zhǔn)輸出流cout輸出它,則返回cout。對于輸出每個(gè)操作符后也都是如此,即返回輸出它的流,以便向流中繼續(xù)插入下一個(gè)數(shù)據(jù)。
resetiosflags(longf):清除f所對應(yīng)的格式化標(biāo)志,功能與成員函數(shù)unsetf(longf)相同。當(dāng)然輸出后返回一個(gè)流。setfill(intc):設(shè)置填充字符為ASCII碼值為c的字符。
setprecision(intn):設(shè)置浮點(diǎn)數(shù)的輸出精度為n。
setw(intw):設(shè)置下一個(gè)數(shù)據(jù)的輸出域?qū)挒閣。在上面的操作符中,dec、oce、hex、endl、ends、flush和ws除了在iomanip.h中有定義外,在iostream.h中也有定義。所以當(dāng)程序或編譯單元中只需要使用這些不帶參數(shù)的操作符時(shí),可以只包含iostream.h文件,而不需要包含iomanip.h文件。下面以標(biāo)準(zhǔn)輸出流對象cout為例,說明使用操作符進(jìn)行的輸出格式化控制?!境绦?.4】#include<iostream>//因iomanip.h中包含有iostream.h,所以該命令可省略
#include<iomanip>usingnamespacestd;intmain(){intx=50,y=500,z=2048;cout<<x<<''<<y<<''<<z<<endl; //按十進(jìn)制輸出
cout<<oct<<x<<''<<y<<''<<z<<endl; //按八進(jìn)制輸出cout<<hex<<x<<''<<y<<''<<z<<endl; //按十六進(jìn)制輸出
cout<<setiosflags(ios::showbase|ios::uppercase);//設(shè)置基指示符和數(shù)值中的字母大寫輸出
cout<<x<<''<<y<<''<<z<<endl; //仍按十六進(jìn)制輸出
cout<<resetiosflags(ios::showbase|ios::uppercase);//取消基指示符和數(shù)值中的字母大寫輸出
cout<<x<<''<<y<<''<<z<<endl; //仍按十六進(jìn)制輸出
cout<<dec<<x<<''<<y<<''<<z<<endl;//按十進(jìn)制輸出
return0;}
此程序的功能和運(yùn)行結(jié)果都與程序5.1完全相同?!境绦?.5】#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intx=564;doubley=-6.635163;cout<<"x="<<setw(10)<<x;cout<<"y="<<setw(10)<<y<<endl;cout<<setiosflags(ios::left); //設(shè)置按左對齊輸出
cout<<"x="<<setw(10)<<x;cout<<"y="<<setw(10)<<y<<endl;cout<<setfill('*'); //設(shè)置填充字符為'*'cout<<setprecision(3); //設(shè)置浮點(diǎn)數(shù)輸出精度為3cout<<setiosflags(ios::showpos); //設(shè)置正數(shù)的正號輸出
cout<<"x="<<setw(10)<<x;cout<<"y="<<setw(10)<<y<<endl;cout<<resetiosflags(ios::left|ios::showpos);cout<<setfill('');return0;}
此程序的功能和運(yùn)行結(jié)果完全與程序5.2相同?!境绦?.6】#include<iostream>#include<iomanip>usingnamespacestd;intmain(){floatx=87,y=-6.298;cout<<x<<''<<y<<endl;cout<<setiosflags(ios::showpoint);cout<<x<<''<<y<<endl;cout<<resetiosflags(ios::showpoint);cout<<setiosflags(ios::scientific);cout<<x<<''<<y<<endl;cout<<setiosflags(ios::fixed);cout<<x<<''<<y<<endl;return0;}
此程序的功能和運(yùn)行結(jié)果完全與程序5.3相同。5.4文件操作對編程來說,文件也是一個(gè)很重要的概念,因?yàn)橛?jì)算機(jī)的內(nèi)存是一個(gè)易失存儲器,當(dāng)斷電時(shí)保存在它里面的數(shù)據(jù)就會丟失。為了要長久地保存一些數(shù)據(jù),就需要磁盤,而磁盤上的數(shù)據(jù)通常都是以文件的形式存在的,我們運(yùn)行的程序也是保存在磁盤上以文件的形式存在的。下面介紹怎樣從文件讀數(shù)據(jù)或向文件寫數(shù)據(jù)。5.4.1文件的概念文件是由文件名標(biāo)識的一組有序數(shù)據(jù)的集合,通常存放在磁盤上。文件名由字母數(shù)字序列組成,且長度有一定限制,如file1.txt、main.cpp。文件有很多種格式,比如文本文件、圖形文件、音頻文件、視頻文件等。5.4.2文件的打開與關(guān)閉 文件流類有ofstream、ifstream和fstream,它們在fstream.h中定義。其中,fstream是ofstream和ifstream多重繼承的子類。文件流類定義的操作應(yīng)用于外部設(shè)備,最典型的設(shè)備是磁盤文件。要定義一個(gè)文件流類對象,須規(guī)定文件名和打開方式。類ofstream用于執(zhí)行文件輸出,其形式如下:
ofstream::ofstream(char*pFileName,intmode=ios::out,intprot=filebuf::openprot);第一個(gè)參數(shù)指向要打開的文件名,第二個(gè)參數(shù)指定文件的打開方式,第三個(gè)參數(shù)指定文件的保護(hù)方式。mode的選項(xiàng)如表5.1所示。
prot是文件保護(hù)方式,它的選項(xiàng)如表5.2所示。表5.1文件打開選項(xiàng)表5.2文件保護(hù)方式選項(xiàng)
需要讀寫文件時(shí),首先必須定義自己的對象,并將它綁定在需要的文件上。打開文件通常有兩種方式,第一種是直接將文件名傳給文件流對象的構(gòu)造函數(shù)。假設(shè)infilename和outfilename是希望讀/寫的文件名的string對象,則編碼如下:
ifstreamreadFromFile(infilename.c_str());ofstreamwriteToFile(outfilename.c_str());
因?yàn)镮/O流只接受字符數(shù)組的文件名,而不接受string對象的文件名,故需要轉(zhuǎn)換。第二種是先定義文件流對象,并沒有捆綁具體的文件。在使用fstream對象之前,還必須使這些對象捆綁要讀/寫的文件。如下所示:
ifstreaminfile;ofstreamoutfile;infile.open("in.txt");outfile.open(out.cpp);
調(diào)用open成員函數(shù)將已存在的fstream對象與特定文件綁定。為了實(shí)現(xiàn)讀/寫,需要將指定的文件打開并定位,open函數(shù)完成系統(tǒng)指定的所有需要的操作。在實(shí)際編程中,打開文件后,要做的第一件事就是檢查打開是否成功:
if(!infile){cerr<<"error:unabletoopeninputfile:"<<infile<<endl;return-1;}
如果打開(open)失敗,則說明fstream對象還沒有為I/O做好準(zhǔn)備,當(dāng)測試對象返回true時(shí)意味著文件已經(jīng)可以使用。當(dāng)用文件流打開一文件時(shí),就保持和該文件關(guān)聯(lián)。如果要把fstream對象與另一個(gè)不同的文件關(guān)聯(lián),則必須先關(guān)閉(close)現(xiàn)在的文件,然后打開(open)另一個(gè)文件:
ifstreaminputfile("infile.txt");inputfile.close();inputfile.open("nfile.txt");
這樣當(dāng)文件流斷開與一個(gè)文件的關(guān)聯(lián)時(shí),就可以和另一個(gè)文件建立關(guān)聯(lián)。若以二進(jìn)制打開文件則必須顯式指明,如下所示:
ifstreaminfile("ifile.dat",ios::in|ios::binary);5.4.3字符文件的訪問操作
C++的文件輸入/輸出流在缺省狀態(tài)下打開時(shí)為文本模式,例如:
#include<fstream>ifstreaminfile("D:\\a.txt");ofstreamoutfile("D:\\b.txt");
都是以文本的模式打開輸入流和輸出流。下面的例子從指定的文本文件讀取數(shù)據(jù)并顯示在屏幕上,在每行前面加上行號。
#include<iostream>#include<fstream>usingnamespacestd;intmain(){ chars[100]; cout<<"Enterthenameofthefile:"<<endl; cin>>s; ifstreamfin(s,ios:in|ios::nocreate); if(!fin) { cout<<"Filecouldnotbeopened."<<endl; return1; }intn=1;
while(!fin.eof()) { fin.getline(s,100); cout<<n<<":"<<s<<endl; n++; } return0;}5.5字符串流
iostream標(biāo)準(zhǔn)庫支持內(nèi)存中的輸入/輸出,只要將流與存儲在程序內(nèi)存中的string對象關(guān)聯(lián)起來即可。此時(shí),就可以使用iostream輸入/輸出操作符讀寫這個(gè)string對象。串流類在strstream.h中定義,其中定義了ostream、istream和strstream三個(gè)串流類。其中,strstream是ostrstream和istrstream多重繼承的子類。要定義串流類對象,必須提供字符數(shù)組和數(shù)組大小。類istrstream用于執(zhí)行串流輸入。例如,下面的代碼定義一個(gè)串流類對象,并對其進(jìn)行輸入操作:
charstr[30]="Whatdoyoulike?\n";charc[6];istrstreamiss(str);iss>>c;cout<<c<<endl;
輸出結(jié)果為:
What
類ostrstream用于執(zhí)行串流輸出,如程序5.7所示。
【程序5.7】#include<iostream>#include<strstream>usingnamespacestd;intmain(){char*str="9054450.54";istrstreamiss(str,0);intnum;floatbalance;iss>>num>>balance; //從串流中讀入一個(gè)整數(shù)和浮點(diǎn)數(shù)
char*pBuf=newchar[64]; memset(pBuf,0,sizeof(char)*64);ostrstreamoss(pBuf,64);oss<<"Thenumberis:"<<num;oss<<",thebalanceis:"<<balance;cout<<pBuf<<endl;delete[]pBuf;return0;}
運(yùn)行結(jié)果如下:
下例是讀入一個(gè)文件,并統(tǒng)計(jì)它的單詞數(shù)。
#include<iostream>#include<strstream>#include<string>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度民用航空安全檢查合同執(zhí)行標(biāo)準(zhǔn)與監(jiān)督措施4篇
- 2025年度智慧城市項(xiàng)目搭建及運(yùn)維服務(wù)合同4篇
- 二零二五版高鐵車輛清洗保養(yǎng)勞務(wù)服務(wù)合同樣本3篇
- 2025版環(huán)保節(jié)能建筑材料采購合同3篇
- 二零二五年度民政局婚姻法律援助中心協(xié)議離婚書模板服務(wù)合同4篇
- 二零二五年度畜牧飼養(yǎng)場廢棄物資源化利用技術(shù)合同3篇
- 二零二五年度旅游度假區(qū)場地租賃與度假產(chǎn)品開發(fā)合同3篇
- 二零二五版農(nóng)業(yè)廢棄物資源化利用合同12篇
- 二零二五年度影視基地租賃協(xié)議延期及拍攝制作合同4篇
- 二零二五年度文化創(chuàng)意產(chǎn)品授權(quán)生產(chǎn)與銷售合同3篇
- 專題24 短文填空 選詞填空 2024年中考英語真題分類匯編
- 再生障礙性貧血課件
- 產(chǎn)后抑郁癥的護(hù)理查房
- 2024年江蘇護(hù)理職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 電能質(zhì)量與安全課件
- 醫(yī)藥營銷團(tuán)隊(duì)建設(shè)與管理
- 工程項(xiàng)目設(shè)計(jì)工作管理方案及設(shè)計(jì)優(yōu)化措施
- 圍場滿族蒙古族自治縣金匯螢石開采有限公司三義號螢石礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 小升初幼升小擇校畢業(yè)升學(xué)兒童簡歷
- 資金支付審批單
- 第一單元(金融知識進(jìn)課堂)課件
評論
0/150
提交評論