第11章C++輸入輸出流與文件系統(tǒng)_第1頁
第11章C++輸入輸出流與文件系統(tǒng)_第2頁
第11章C++輸入輸出流與文件系統(tǒng)_第3頁
第11章C++輸入輸出流與文件系統(tǒng)_第4頁
第11章C++輸入輸出流與文件系統(tǒng)_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第1111章章 C+輸入輸入/輸出流與文件系統(tǒng)輸出流與文件系統(tǒng)學(xué)習(xí)目標(biāo)理解C+的輸入/輸出流的概念;熟悉I/O流的工作過程;熟悉各種格式標(biāo)志與各種格式控制方法;分清文本文件與二進(jìn)制文件的區(qū)別;掌握文本文件的輸入/輸出的步驟與操作;掌握二進(jìn)制文件的輸入/輸出的步驟與操作;會運用文件指針以及各種標(biāo)志; C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 C+中的I/O流實際上是一個處于傳輸狀態(tài)的字節(jié)序列,這些字節(jié)序列按順序從一個對象傳送到另一個對象,在對象之間的“流動”。流流形象表示了信息從源到目的端的傳送過程。 在C+程序中,流的操作包括數(shù)據(jù)的輸入與輸出。輸入操作是字節(jié)從

2、外輸入操作是字節(jié)序列從外部設(shè)備(包括鍵盤、磁盤、網(wǎng)絡(luò)連接)輸入到內(nèi)存,是字節(jié)從設(shè)備到內(nèi)存的流動。輸出操作是從內(nèi)存輸出到外部設(shè)備(如顯示器、打印機、磁盤、網(wǎng)絡(luò)連接),是字節(jié)從內(nèi)存到外部設(shè)備的流動。C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流1. I/O流的概念流的概念 basic_ios basic_istream basic_ostream basic_ifstream basic_iostream basic_ofstream basic_fstream ios_base 在C+中,數(shù)據(jù)的輸入/輸出是通過I/O流類庫實現(xiàn)的。C+的I/O流類流類庫庫采用功能強大的類

3、層次層次結(jié)構(gòu)結(jié)構(gòu)實現(xiàn),它能夠提供數(shù)百種與數(shù)據(jù)輸入和輸出相關(guān)的功能,I/O流類庫中各個類模板之間的層次關(guān)系如圖11-1所示 I/O流類模板流類模板是流類庫的基礎(chǔ),描述如下: ios類是類模板basic_ios的窄字符的實例,是所有I/O流類的基礎(chǔ)類,描述了流的基本性質(zhì)。 派生類istream與ostream從公共基類繼承了一些成員,在這些繼承來的數(shù)據(jù)成員中,大部分用于描述流的屬性或特征,如流的格式與狀態(tài)。 除了繼承來的成員外,istream與ostream各自添加了合適的本地成員,并重載了適當(dāng)?shù)倪\算符。例如istream增加了在流中讀取數(shù)據(jù)和移動數(shù)據(jù)的方法。對提取運算符進(jìn)行了重載。 iostre

4、am 對istream和ostream進(jìn)行了多重派生,因而它既繼承了讀取流操作,又繼承了寫入流操作。但iostream沒有增加額外的數(shù)據(jù)成員,而且除了構(gòu)造函數(shù)與析構(gòu)函數(shù)外,沒有新增其他成員函數(shù)。 ifstream與ofstream分別用于文件的輸入與輸出,派生于iostream的fstream用于控制文件流的輸入輸出。 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流1. I/O流的概念流的概念 要從I/O流中獲取數(shù)據(jù)或向流中添加數(shù)據(jù),必須使用流插入運算符流插入運算符“”。 “”本來在C+中被定義為左移位運算符和右移位運算符的,但為了I/O的需要,C+又將它們進(jìn)行了重重

5、載載,以便能用它們輸入或輸出各種類型的數(shù)據(jù)。 輸出流是就是流向輸出設(shè)備的數(shù)據(jù)信息。輸出流對象是數(shù)據(jù)信息流向的目標(biāo)。 在C+中,最重要的三個輸出流是ostream,fostream和ostrstream。ostream類可以提供無格式化輸出和格式化輸出。 例如:用插入運算符輸出標(biāo)準(zhǔn)類型數(shù)據(jù);用put成員函數(shù)輸出字符;用write成員函數(shù)實現(xiàn)無格式輸出。 最常用的輸出方法是在cout上用插入運算符插入運算符,插入運算符可以接受任何標(biāo)準(zhǔn)類型的實參,包括const char *、標(biāo)準(zhǔn)庫string、complex等類型。實參可以是任何表達(dá)式包括函數(shù)調(diào)用,只要其結(jié)果是能被插入運算符能接受的數(shù)據(jù)類型即可。

6、2. 輸出流輸出流 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板123456789101112131415161717181920212324252627/* 程序文件名: p11_1.cpp * 功能:演示的功能 * */# include # include # include using namespace std;int main() char *s1=a c string; string s2(a c+ string); complex c (3.14159,-1.234); int i(10); int *pi=&i;

7、couts1endl s2endl; coutcendl; couti+ti+ti+endl; cout&i:&itpi:piendl; cout&s1:&s1ts1:const_cast(s1)endl; / s1:(void *)s1endl; return 0; 運行結(jié)果運行結(jié)果: :a c stringa c+ string(3.14159,-1.234)12 11 10&i:0012FF4C pi:0012FF4C&s1:0012FF70 s1:00473040 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流

8、2.鏈表類模板鏈表類模板123456789101112131415/* 程序文件名: p11_2.cpp * 功能:演示的優(yōu)先級 * 設(shè)計者: Antony * 時 間: 8-18-2006 */# include using namespace std;int main() int val1(10),val2(20);coutthe larger of val1,val2 is:;cout val2) ? val1 : val2; / cout10endl; 錯誤 return 0; 運行結(jié)果運行結(jié)果: :the larger of 10, 20 is 0 C+語語言言程程序序設(shè)設(shè)計計教教程

9、程第第11章章C+輸輸入入輸輸出出流流 格式標(biāo)志格式標(biāo)志是一組用于設(shè)置I/O流格式狀態(tài)字的一個數(shù),這些格式標(biāo)志屬于ios類。 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流=3. 流的格式控制流的格式控制 表11-2 I/O流格式標(biāo)志功能表 表中帶*號的表示默認(rèn)設(shè)置,|為或運算。分 類標(biāo) 志 符功 能進(jìn)制*ios:dec指定整數(shù)以十進(jìn)制顯示ios:oct指定整數(shù)以八進(jìn)制顯示ios:hex指定整數(shù)以十六進(jìn)制顯示對齊ios:left在域中左對齊,填充字符加到右邊*ios:right在域中右對齊,填充字符加到左邊ios:internal數(shù)字的符號在域中左對齊,數(shù)字在域中右對

10、齊,填充字符加到中間浮點數(shù)*ios:fixed以小數(shù)形式顯示浮點數(shù), 默認(rèn)小數(shù)部分為6位(包括小數(shù)點)ios:scientific以科學(xué)計數(shù)法形式顯示浮點數(shù)空格*ios:skipws忽略輸入流的空格正號ios:showpos在正數(shù)前顯示+號小數(shù)點ios:showpoint不管浮點數(shù)小數(shù)部分是否為0,總是顯示小數(shù)點進(jìn)制基數(shù)ios:showbase顯示進(jìn)制基數(shù)(前綴),八進(jìn)制為0,十六進(jìn)制為0 x或0X字母大寫ios:uppercase十六進(jìn)制數(shù)中字母大寫顯示,科學(xué)記數(shù)法中e顯示成大寫E布爾值ios:boolalpha分別以true和false字符串形式表示真與假流刷新ios:unitbuf輸出操

11、作后刷新流進(jìn)制組合ios:basefielddec | hex | oct對齊組合ios:adjustfieldinternal | left | right浮點組合ios:floatfieldfixed | scientificC+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 每一個輸入/輸出流對象都維護(hù)一個格式狀態(tài)字格式狀態(tài)字,用它表示流對象當(dāng)前的格式狀態(tài)并控制流的格式,例如整型值的進(jìn)制基數(shù)或浮點數(shù)的精度。C+提供了多種格式控制的方法,如使用操縱符修改對象的格式狀態(tài)字來控制流的格式、運用成員函數(shù)。3. 流的格式控制流的格式控制 表表11-3 格式狀態(tài)字設(shè)置函數(shù)格式狀

12、態(tài)字設(shè)置函數(shù)函數(shù)函數(shù)功能功能long flags() const返回流的當(dāng)前格式狀態(tài)字long flags( long lFlags )設(shè)置流的格式位IFlags,返回以前的格式long setf( long lFlags )設(shè)置流的格式位IFlags,返回以前的格式long setf( long lFlags, long lMask )清除IMask,設(shè)置IFlags, 返回以前的格式long unsetf( long lFlags )清除IMask 其中, IFlags與IMask 可以是單個格式標(biāo)志,也可以是與運算& 和或運算|將格式標(biāo)志連接的表達(dá)式,還可以是一個長整型數(shù)。C+語

13、語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板123456789101112131415161718192021/* 程序名:p11_3.cpp * 功能: 揭開格式標(biāo)志的秘密 * By Antony * 8-19-2006 */# include using namespace std;struct fmtflags long flag; char flagname12; flags18=ios:hex,hex,ios:dec,dec,ios:oct,oct,ios:basefield,basefield,ios:internal,interna

14、l,ios:left,left,ios:right,right,ios:adjustfield,adjustfield, ios:fixed,fixed,ios:scientific,scientific,C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板222324252627282930313233343536373839 ios:basefield,basefield,ios:showbase,showbase,ios:showpoint,showpoint, ios:showpos,showpos,ios:skipws,skipws,io

15、s:uppercase,uppercase,ios:boolalpha,boolalpha,ios:unitbuf,unitbuf;int main() long IFlags; IFlags=cout.setf(0,cout.flags(); cout.setf(ios:hex,ios:basefield); coutDefault flag is:IFlagsendl; for(int i=0;i18;i+) coutflagsi.flagtflagsi.flagnameendl; return 0; 運行結(jié)果運行結(jié)果: :Default flag is:201800hex200dec40

16、0octe00basefield100internal40left80right1c0adjustfield2000fixed1000scientifice00basefield8showbase10showpoint20showpos1skipws4uppercase4000boolalpha2unitbuf C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 C+還提供了許多流操縱符,用于執(zhí)行格式化的輸入/輸出操作,這些操縱符可以直接用在流中。4. 格式操縱符格式操縱符 表表11-4 格式操縱符格式操縱符分類分類操縱符操縱符功能功能進(jìn)制*dec指定整數(shù)以十進(jìn)制顯示oc

17、t指定整數(shù)以八進(jìn)制顯示hex指定整數(shù)以十六進(jìn)制顯示setbase(n)設(shè)定以n進(jìn)制顯示,n為8,10,16對齊left在域中左對齊,填充字符加到右邊*right在域中右對齊,填充字符加到左邊internal數(shù)字的符號在域中左對齊,數(shù)字在域中右對齊,填充字符加到中間浮點數(shù)顯示*fixed以小數(shù)形式顯示浮點數(shù), 默認(rèn)小數(shù)部分為6位(包括小數(shù)點)scientific以科學(xué)計數(shù)法形式顯示浮點數(shù)空格*skipws忽略輸入流的空格noskipws清除skipws,恢復(fù)輸入流的空格正號showpos*noshowpos在正數(shù)前顯示+號清除showpos, 在正數(shù)前不顯示+號showpos*noshowpos

18、在正數(shù)前顯示+號清除showpos, 在正數(shù)前不顯示+號C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流分類分類操縱符操縱符功能功能小數(shù)點showpoint顯示小數(shù)點*noshowpoint清除showpoint, 不顯示小數(shù)部分為0的數(shù)的小數(shù)點進(jìn)制基數(shù)showbase顯示進(jìn)制基數(shù)(前綴),八進(jìn)制為0,十六進(jìn)制為0 x或0X*noshowbase清除showbase, 不顯示進(jìn)制基數(shù)字母大寫uppercase十六進(jìn)制數(shù)中字母大寫顯示,科學(xué)計數(shù)法中e顯示成大寫E*noupercase清除uppercase, 十六進(jìn)制與科學(xué)計數(shù)法中字母小寫宣示布爾值boolalpha分別以

19、true和false字符串形式表示真與假*noboolalpha清除boolalpha,恢復(fù)用數(shù)值表示bool型數(shù)流刷新unitbuf輸出操作后刷新流*nounitbuf清除unibuf, 輸出操作后不刷新流換行endl換行,并刷新輸出流緩沖區(qū)插空ends插入空字符,并刷新輸出流緩沖區(qū)過濾空ws過濾空字符域?qū)抯etw(n)設(shè)置當(dāng)前域?qū)捰蛱畛鋝etfill(c)設(shè)置域中空白的填充字符,c為字符,默認(rèn)為空格浮點數(shù)精度setprecision(n)設(shè)置浮點數(shù)小數(shù)部分包括小數(shù)點的位數(shù),默認(rèn)為6設(shè)置格式setiosflags(flag)設(shè)置格式標(biāo)志重設(shè)格式resetflags()重新設(shè)置格式為默認(rèn)格式C

20、+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板1234567891011121314151617/* 程序名:p11_4.cpp * 功能: 格式操縱符舉例 */# include using namespace std;int main() bool boolv(10); int x(100); long IFlags; IFlags=cout.setf(0,cout.flags(); coutDefault flag is:hexIFlagsendl; coutAfter set Hex:cout.flags()endl; coutbool

21、value:boolv boolalpha:boolalpha; coutboolv x=xendl; return 0; 運行結(jié)果運行結(jié)果: :Default flag is:201After set Hex:800boolvalue:1 boolalpha:true x=64 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流5. 格式控制成員函數(shù)格式控制成員函數(shù) 表表11-5 格式控制成員函數(shù)格式控制成員函數(shù)分類分類函數(shù)原型函數(shù)原型功能功能域?qū)抜nt width(int nw)設(shè)置當(dāng)前域?qū)捰蛱畛鋍har fill(char c)設(shè)置域中空白的填充字符,c為字符,默認(rèn)

22、為空格浮點數(shù)精度int precision(int n)設(shè)置浮點數(shù)小數(shù)部分包括小數(shù)點的位數(shù),默認(rèn)為6設(shè)置格式long flags( long lFlags ) 設(shè)置格式標(biāo)志見表11-2 從成員函數(shù)表中可以看出, 成員函數(shù)的功能與操縱符中的函數(shù)對應(yīng)對應(yīng)。如:width()與setw(),fill(c)與setfill(c),precision(n)與setprecision(n),flags(flag)與setiosflags(flag)分別對應(yīng)。C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板12345678910111213141516171

23、81920/* 程序名:p10_5.cpp * 功能: 格式操縱符與成員函數(shù)對比 * By Antony * 11-24-2005 */# include # include using namespace std;int main() double PI=3.1415926535;int precision;coutfixed;coutPIendl;cout.width(8);cout.fill(0);for(precision=0;precision=9;precision+) cout.precision(precision);coutPIendl;C+語語言言程程序序設(shè)設(shè)計計教教程程第

24、第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板212223242526272829coutPIendl; coutsetw(8)setfill(0);for(precision=0;precision=9;precision+) coutsetprecision(precision);coutPIendl;coutPI。 格式如下: cinobj1obj2; 提取操作符從與鍵盤相連的標(biāo)準(zhǔn)輸入流cin中提取數(shù)據(jù)拷貝給相應(yīng)的對象。數(shù)據(jù)的提取與拷貝是從輸入回車開始的,提取操作符忽略了流中的空白、制表符、回車,換行。當(dāng)遇到流結(jié)束標(biāo)志EOF(-1),或者提取了一個無效的值試圖拷貝給對象時,

25、提取操作符返回0(false) 給cin。 每個輸入流都含有一系列錯誤狀態(tài)位,當(dāng)提取了一個無效值給對象時,比如:輸入類型錯時,除了返回出錯信息false給cin外, 還會設(shè)置流的failbit狀態(tài)位,結(jié)束提取操作。11.4 輸入輸入流流 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板123456789101112131415/* 程序名:p11_6.cpp * 功能: 標(biāo)準(zhǔn)輸入 */# include # include using namespace std;int main() float f;int i;string s;while(c

26、infis) coutftitsendl; return 0; 運行結(jié)果運行結(jié)果: :2 a 3.4 5.6 7.8 9 a b 2 a3.4 5 .67.8 9 a C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流表表11-6 輸入流常用成員函數(shù)輸入流常用成員函數(shù)函數(shù)原型函數(shù)原型說說 明明int get()提取一字符(包括空格),然后返回該字符的值;若沒有讀到字符,返回EOF,并設(shè)置流對象的failbit標(biāo)志。istream& get( char& ch )提取一字符(包括空格)給ch,返回istream對象的引用;其余與get()相同。 istrea

27、m& get(char* pch, int nCount, char delim = n)提取最多nCount-1個字符給pch數(shù)組,遇到第nCount個字符或遇分隔符delim(默認(rèn)為n)或到達(dá)文件結(jié)束,則停止提取。存入pch中的字符串以null結(jié)尾,分隔符不存入pch。istream& getline( char* pch, int nCount, char delim = n)提取最多nCount-1個字符給pch數(shù)組, 遇到第nCount個字符或遇分隔符delim(默認(rèn)為n)或到達(dá)文件結(jié)束,則停止提取。存入pch中的字符串以null結(jié)尾,分隔符不存入pch。istrea

28、m& ignore( int nCount = 1, int delim = EOF)忽略數(shù)據(jù)流中delim分隔符號之前至多nCount個字符。缺省情況ignore()將從被調(diào)用的istream對象中讀入一個字符EOF,并丟棄。int gcount() const返回前次運用get(),getline()提取的字符數(shù)。int peek()返回輸入流的下一個字符,如遇流結(jié)束或出錯,返回EOF。istream& putback( char ch )將上一次從輸入流中通過get獲取的字符再放回該輸入流中。istream& read( char* pch, int nCount

29、 )從輸入流中提取字節(jié),放入pch開始的內(nèi)存中,直到遇到第nCount個字節(jié)或到達(dá)文件結(jié)束。返回當(dāng)前被調(diào)用的istream類對象C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板1234567891011121314151617/* 程序名:p11_7.cpp * 功能: 輸入函數(shù)get舉例 */# include using namespace std;int main() int count;int max_char=5;char line100; while(cin.get(line,max_char) count=cin.gcount()

30、;coutlinetcountendl; / if (countmax_char-1) cin.ignore(); return 0; 運行結(jié)果運行結(jié)果: :1234567890 1234 45678 490 2 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 2.鏈表類模板鏈表類模板C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流12345678910111213141516/* 程序名:p11_8.cpp * 功能: 輸入函數(shù)getline舉例 */# include using namespace std;int main() int m

31、ax_char=5,i=0;char line100; while(cin.getline(line,max_char) couti:linetcin.gcount()endl; i+;couti:linetcin.gcount()endl; return 0; 運行結(jié)果運行結(jié)果: :1234567890 或或12345 0:1234 4 對編程者而言,用戶的行為是無法預(yù)測的。如當(dāng)程序期望用戶輸入整數(shù),而用戶有意或無意輸入了字符串,或超過了整數(shù)表示范圍的數(shù)。這都會使數(shù)據(jù)流產(chǎn)生錯誤。在ios類中,除了提供控制數(shù)據(jù)流的格式標(biāo)志、操縱符、成員函數(shù),還提供了流的錯誤偵測函數(shù)錯誤偵測函數(shù)與錯誤狀態(tài)位錯誤

32、狀態(tài)位。 這些流錯誤狀態(tài)位(標(biāo)志 )屬于ios類,各種標(biāo)志及意義如表11-7: C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流11.5 數(shù)據(jù)流的錯誤偵測數(shù)據(jù)流的錯誤偵測 表表11-7 流錯誤狀態(tài)標(biāo)志流錯誤狀態(tài)標(biāo)志 錯誤標(biāo)志錯誤標(biāo)志說明說明ios:goodbit數(shù)據(jù)流沒有發(fā)生錯誤,即數(shù)據(jù)流錯誤狀態(tài)位沒有設(shè)定。ios:eofbit數(shù)據(jù)流已到達(dá)尾端(遇到end-of-file)。ios:failbit輸入/輸出時數(shù)據(jù)格式不符合或eof太早出現(xiàn),屬于可恢復(fù)的流錯誤,數(shù)據(jù)不會丟失。ios:badbit不可恢復(fù)的流錯誤,導(dǎo)致數(shù)據(jù)丟失。流的這些錯誤可以使用ios類提供的錯誤偵測函數(shù)

33、來讀取。流錯誤偵測函數(shù)如表11-8。C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流表表11-8 流錯誤偵測函數(shù)流錯誤偵測函數(shù) 流的這些錯誤可以使用ios類提供的錯誤偵測函數(shù)來讀取。流錯誤偵測函數(shù)如表11-8。 函數(shù)原型函數(shù)原型說明說明int rdstate() const返回數(shù)據(jù)流當(dāng)前的狀態(tài)位。void clear(int nState = 0)設(shè)置流狀態(tài)為指定值。int good() const如果錯誤狀態(tài)位為0(ios:goodbit已設(shè)置),返回true; 否則返回falseint eof() const如果到達(dá)文件結(jié)束(ios:eofbit已設(shè)置),返回tru

34、e; 否則返回falseint fail() const如果ios:failbit或ios:badbit已設(shè)置,返回true; 否則返回falseint bad() const如果偵測到嚴(yán)重的I/O錯(ios:badbit已設(shè)置),返回true; 否則返回false。11.5 數(shù)據(jù)流的錯誤偵測數(shù)據(jù)流的錯誤偵測 2.鏈表類模板鏈表類模板C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流1234567891011121314151617181920/* 程序名: p11_9.cpp * 功 能: 數(shù)據(jù)流錯誤偵測 */#include using namespace std;

35、int main() int number; coutcin.rdstate()=cin.rdstate()number;if(cin.rdstate() = ios:goodbit) /if(cin.good() /ok coutInput is correct!endl; break; 2.鏈表類模板鏈表類模板C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流2122232425262728293031 if(cin.rdstate() = ios_base:failbit)/if(cin.fail() /ok coutInput is error!endl;cin.

36、clear(ios:goodbit);coutcin.rdstate()=cin.rdstate()endl; cin.get(); return 0; 運行結(jié)果運行結(jié)果: :cin.rdstate()=0aInput is error!cin.rdstate()=0bInput is error!cin.rdstate()=08Input is correct! 到目前為止,程序執(zhí)行所需的數(shù)據(jù)由鍵盤輸入,執(zhí)行的結(jié)果在顯示器上顯示或臨時存于內(nèi)存中,一旦程序執(zhí)行完畢,數(shù)據(jù)將從內(nèi)存中消失。下一次執(zhí)行數(shù)據(jù)必須重新輸入重新輸入。 將程序所需數(shù)據(jù)和產(chǎn)生的數(shù)據(jù)保存的方法是使用文件,文件是保存在輔存中,如磁

37、盤、光盤、磁帶中的數(shù)據(jù)集合。 C+語言把每個文件看成是一個有序的字節(jié)流有序的字節(jié)流。文件打開時,就創(chuàng)建一個對象,并將這個對象和某個流關(guān)聯(lián)起來。包含時,會自動生成cin、cout、cerr和clog這4個對象,與這些對象關(guān)聯(lián)的流提供與文件通信的方法(文件操作)。如cin對象使程序從鍵盤或文件中輸入數(shù)據(jù),cout對象使程序能向屏幕或文件輸出數(shù)據(jù),cerr和clog使程序能向屏幕或其他設(shè)備輸出錯誤信息。 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流11.6 文件的輸出文件的輸出/輸入輸入 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流1. 文件的

38、創(chuàng)建文件的創(chuàng)建 C+負(fù)責(zé)文件輸出/輸入的類有ifstream(文件輸入文件輸入),ofstream(文件輸出文件輸出)以及fstream(文件輸出文件輸出/輸入輸入),見圖11.1。 所謂的文件輸入輸出,是從程序或內(nèi)存的角度而言的,文件輸入文件輸入是指從文件向內(nèi)存讀入數(shù)據(jù);文件輸出文件輸出則指從內(nèi)存向文件輸出數(shù)據(jù)。類ifstream、ofstream、fstream分別在包含頭文件ifstream、ofstream、fstream中定義,要使用它們,必須包含相應(yīng)的頭文件。 可以使用這些類建立文件流對象文件流對象。 如下列語句: fstream myfile; 建立了一個文件流對象myfile。

39、然后利用fstream提供的open()成員函數(shù)打開文件與流連接。open()函數(shù)的原型如下:void open( const charvoid open( const char* * szName, int , int nMode = ios:in, int = ios:in, int nProt =filebuf:openprot )=filebuf:openprot )C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流表表11-9 文件打開文件打開(操作操作)模式表模式表 模式參數(shù)模式參數(shù)說明說明ios:in為輸入打開文件,是fstream,istream的默認(rèn)模式

40、。ios:out為輸出打開文件,是ostream的默認(rèn)模式。ios:ate打開文件輸出,文件指針處于文件尾。ate=at endios:app從文件尾添加數(shù)據(jù)。ios:trunc如文件存在,清除文件內(nèi)容(默認(rèn)模式)ios:nocreate要打開的文件不存在則產(chǎn)生錯誤。ios:noreplace如文件存在,且ate與app未被設(shè)定,則產(chǎn)生錯誤ios:binary以二進(jìn)制方式打開文件(默認(rèn)模式為文本模式)C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流1) 文件的創(chuàng)建文件的創(chuàng)建 例如: myfile.open(d:myprogp1_1.cpp, ios:in|ios:out

41、); 打開文本文件p1_1.cpp用于輸入輸出。 當(dāng)用fstream、ofstream、ifstream建立文件流對象時可直接給出文件名、操作模式等參數(shù),這樣可以省略open()函數(shù)的使用。 輸出文件流的建立可以使用如下方法: fstream ofile(c:myprogf1.cpp, ios:out); ofstream ofile(c:myprogf1.cpp) 輸入文件流的建立方法: fstream ifile(c:myprogf1.dat, ios:in) ifstream ifile(c:myprogdat.cpp) 從圖11-1 I/O流類層次結(jié)構(gòu)中可以看出, fstream類繼承

42、于iostream, 而iostream又繼承于istream和ostream,因此,定義于istream與ostream處理數(shù)據(jù)流輸出與輸入的成員函數(shù)都可以用在文件的輸出與輸入上。C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流2) 文本文件的輸出文本文件的輸出 C+的文件I/O模式分為兩種:文本模式與二進(jìn)制模式文本模式與二進(jìn)制模式,默認(rèn)的文件模式為文本模式。當(dāng)使用文本模式時,輸出到文件的內(nèi)容為ASCII碼字符(包括回車、換行) 。也就是說,文本文件文本文件中只能存儲ASCII碼字符。如整數(shù)123與浮點數(shù)234.5在文本文件中分別存儲為: ”123”與”234.5”。

43、 文本文件通常以.txt為后綴,C+的源程序文件也屬于文本文件。文本文件在windows的記事本與書寫器中都能打開,在linux系統(tǒng)下可以用vi, emacs等文本編輯軟件來編輯。 文本文件文本文件輸出可用插入操作符與成員函數(shù)write()。 文件輸出的步驟一般為: (1) 建立輸出文件流(對象),將建立的文件連接到文件流上。此步需要對文件是否建立成功進(jìn)行判斷,如果文件建立錯誤,則退出。 (2) 向輸出文件流輸出內(nèi)容。 (3) 關(guān)閉文件(文件流對象消失時也會自動關(guān)閉文件) 2.鏈表類模板鏈表類模板C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流1234567891011

44、1213141516171819202122/* 程序名:p11_10.cpp * 功能: 文本文件輸出舉例 */# include # include using namespace std;int main() char line180;fstream myfile; /建立文件流myfile.open(d:c+bookrecord.txt, ios:out|ios:trunc);if(!myfile) cerrFile open or create error!line) myfileline;myfile.close(); return 0; 運行結(jié)果運行結(jié)果: :輸入:Antony8

45、0.5 John 90 Tom 60 Z 文件record.txt中的內(nèi)容為:Antony80.5John90Tom60 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流3)二進(jìn)制文件輸出二進(jìn)制文件輸出 文本文件中存儲的是字符串字符串,當(dāng)我們要使用其中的數(shù)據(jù)就不方便了,如求學(xué)生成績文件中的學(xué)生成績的平均分。 二進(jìn)制文件二進(jìn)制文件是指含含ASCII碼字符外的數(shù)據(jù)的文件碼字符外的數(shù)據(jù)的文件,它不能由文本編輯軟件打開。在實際應(yīng)用中,大多數(shù)文件都是二進(jìn)制文件,如圖象文件(后綴包括.bmp, .jpg, .tif, .gif等),影像文件,聲音文件,數(shù)據(jù)庫文件。 Microsof

46、t Word 的.doc文件也是二進(jìn)制文件,因為除了字符外,它還含有字體、字號、顏色等數(shù)據(jù)。輸出二進(jìn)制文件的方法是使用write()成員函數(shù)。 2.鏈表類模板鏈表類模板C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流1234567891011121314151617/* 程序名:p11_11.cpp * 功能: 二進(jìn)制文件與文本文件比較 */# include # include using namespace std;int main() char *name3=Antony,John,Tom;float score3=85.5, 90, 60;fstream txt

47、file,binfile; /建立文件流對象txtfile.open(d:c+bookrecord.txt,ios:out|ios:trunc); binfile.open(d:c+bookrecord.dat,ios:binary|ios:out|ios:trunc);if(!txtfile) cerr record.txt open or create error!endl;exit(1); 2.鏈表類模板鏈表類模板1819202122232425262728293031 if(!binfile) cerr record.dat open or create error!endl;exit

48、(1);for(int i=0;i3;i+) txtfilenameitscorei, 在文件輸入中要經(jīng)常檢查文件是否到達(dá)尾部,輸入流的成員函數(shù)eof()用來偵測是否到達(dá)文件結(jié)尾。若讀取到文件結(jié)尾時,返回true 。 文件輸出一般要經(jīng)過下列三個步驟: (1) 建立輸入文件流(對象),將以輸入方式打開的文件連接到文件流上。此步需要對文件是否打開成功進(jìn)行判斷,如果文件打開錯誤,則退出。 (2) 從輸入文件流中讀內(nèi)容。此步需要對讀文件是否成功進(jìn)行判斷,如果讀入不成功或到文件尾,則讀入結(jié)束。 (3) 關(guān)閉文件(文件流對象消失時也會自動關(guān)閉文件)。 2.鏈表類模板鏈表類模板C+語語言言程程序序設(shè)設(shè)計計教

49、教程程第第11章章C+輸輸入入輸輸出出流流12345678910111213141516171819202122/* 程序名:p11_12.cpp * 功能: 文本文件的輸入 */# include # include using namespace std;int main() char name8,score6;ifstream txtfile; /建立輸入文件流對象txtfile.open(d:c+bookrecord.txt); if(!txtfile) cerr record.txt open error!namescore;coutnametscoreendl;txtfile.cl

50、ose(); return 0; C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流5) 二進(jìn)制文件輸入二進(jìn)制文件輸入 輸入二進(jìn)制文件使用成員函數(shù)read()每次讀取固定長度的數(shù)據(jù),同樣用eof()判斷是否到達(dá)文件尾。 1234567891011121314/* 程序名:p11_13.cpp * 功能: 二進(jìn)制文件的輸入 */# include # include using namespace std;int main() char name8;float score;ifstream binfile; /建立輸入文件流對象binfile.open(d:c+bookre

51、cord.dat,ios:binary); if(!binfile) cerr record.dat open error!endl; 2.鏈表類模板鏈表類模板C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流15161718192021222324exit(1);while(!binfile.eof() binfile.read(reinterpret_cast(name),8*sizeof(char); binfile.read(reinterpret_cast(&score),sizeof(float); coutnametscoreendl;binfile

52、.close(); return 0; 運行結(jié)果運行結(jié)果: :Antony80.5John90Tom 60Tom 60 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流 在文件中,特別是二進(jìn)制文件,每一筆數(shù)據(jù)(記錄)都是一個接著一個連續(xù)排列。文件中記錄的排列與內(nèi)存中的數(shù)組一樣。 前面例子對文件的讀寫都是從頭到尾,是否可以象讀取數(shù)組一樣隨機讀取文件中某個記錄?有了文件指針文件指針后,就可以直接跳到指針處,讀寫指針處的記錄。 在ios類中,定義了三個特定的文件指針: ios:beg, 文件開頭指針 ios:cur, 當(dāng)前指針位置 ios:end, 文件尾指針6)文件指針的使

53、用)文件指針的使用 C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流表表11-11 指針成員函數(shù)表指針成員函數(shù)表 在istream與ostream類里定義了一些用來移動指針的成員函數(shù),我們稱為指針成員函數(shù)指針成員函數(shù)。列表如表11-11。 6)文件指針的使用)文件指針的使用 函數(shù)原型函數(shù)原型功能功能istream的成員函數(shù)的成員函數(shù)istream& seekg(long off, ios:seek_dir dir )設(shè)定讀取指針到距離文件某一特定位置off個字節(jié)的位置。特定位置由dir決定,dir為ios:beg,ios:cur,ios:end之一。當(dāng)特定位置為

54、ios:end時,off應(yīng)為負(fù)數(shù)。long tellg( )返回讀指針相對于文件頭的位置。ostream的成員函數(shù)的成員函數(shù)ostream& seekp(long off, ios:seek_dir dir )設(shè)定寫指針到距離文件某一特定位置off個字節(jié)的位置。特定位置由dir決定,dir為ios:beg,ios:cur,ios:end之一。當(dāng)特定位置為ios:end時,off應(yīng)為負(fù)數(shù)。long tellp()返回寫指針相對于文件頭的位置。 2.鏈表類模板鏈表類模板C+語語言言程程序序設(shè)設(shè)計計教教程程第第11章章C+輸輸入入輸輸出出流流123467891011121314151617181920212223/* 程序名:p11_14.cpp * 功能: 文件指針使用實例 * */# include # include using namespace std;int main() char name18,name28;float score1,score2;int rec_num, rec_size, i;fstream binfile(d:c+bookprogrecord.dat,ios:out|ios:in|ios:binary); if(!binfile) cerr record.dat op

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論