第 輸入輸出流PPT課件_第1頁
第 輸入輸出流PPT課件_第2頁
第 輸入輸出流PPT課件_第3頁
第 輸入輸出流PPT課件_第4頁
第 輸入輸出流PPT課件_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、14.1 輸入輸出基本概念輸入輸出基本概念14.1.1輸入輸出流輸入輸出流(Stream)流流 - 數(shù)據(jù)在程序和設(shè)備之間數(shù)據(jù)在程序和設(shè)備之間“流動流動”邏輯邏輯設(shè)備設(shè)備內(nèi)部內(nèi)部程序程序數(shù)據(jù)數(shù)據(jù)輸入流輸入流輸出流輸出流數(shù)據(jù)數(shù)據(jù)邏輯邏輯設(shè)備設(shè)備文本流文本流 - 一串一串 ASCII 字符。字符。二進(jìn)制流二進(jìn)制流 - 按二進(jìn)制格式存放的數(shù)據(jù)(內(nèi)存映象)。按二進(jìn)制格式存放的數(shù)據(jù)(內(nèi)存映象)。14.1.2 文本流、二進(jìn)制流和數(shù)據(jù)文件文本流、二進(jìn)制流和數(shù)據(jù)文件第1頁/共65頁數(shù)值數(shù)值 12345 在在 文本流文本流中和中和二進(jìn)制流二進(jìn)制流中的形式:中的形式:00110001 00110010 001100

2、1100110100 00110101 1 2 3 4 5 ASCII 形式:形式:(文本流文本流 , 字符串字符串)區(qū)別:區(qū)別:在內(nèi)存中在內(nèi)存中int 型數(shù)據(jù)的形式型數(shù)據(jù)的形式:00110000 0011100100000000 00000000在二進(jìn)制流中的形式:在二進(jìn)制流中的形式:00110000 0011100100000000 00000000在在“流流”中的中的數(shù)據(jù)是以字節(jié)數(shù)據(jù)是以字節(jié)為單位的。為單位的。第2頁/共65頁整數(shù)整數(shù) 12345 若存于文本文件中,占若存于文本文件中,占 5 個字節(jié),個字節(jié), 即存放即存放 5 個個 ASCII 字符(看成字符串)字符(看成字符串) 若存

3、于二進(jìn)制文件中,占若存于二進(jìn)制文件中,占 4 個字節(jié),內(nèi)存映象個字節(jié),內(nèi)存映象 因為一個整數(shù)在內(nèi)存中占因為一個整數(shù)在內(nèi)存中占 4 個字節(jié)個字節(jié)一個一個邏輯設(shè)備邏輯設(shè)備對應(yīng)一個對應(yīng)一個文件文件,“文件文件”指指:(1) 磁盤文件磁盤文件(2) 設(shè)備文件設(shè)備文件(如鍵盤、顯示器、打印機(jī)等如鍵盤、顯示器、打印機(jī)等)數(shù)據(jù)文件數(shù)據(jù)文件用于存放信息:用于存放信息: 存放存放ASCII字符的文件稱為字符的文件稱為文本文件。文本文件。 存放二進(jìn)制數(shù)據(jù)的文件稱為存放二進(jìn)制數(shù)據(jù)的文件稱為二進(jìn)制文件。二進(jìn)制文件。第3頁/共65頁14.1.3 緩沖緩沖邏輯邏輯設(shè)備設(shè)備內(nèi)部內(nèi)部程序程序數(shù)據(jù)數(shù)據(jù)輸入流輸入流輸出流輸出流數(shù)

4、據(jù)數(shù)據(jù)邏輯邏輯設(shè)備設(shè)備內(nèi)存緩沖區(qū)內(nèi)存緩沖區(qū)內(nèi)存緩沖區(qū)內(nèi)存緩沖區(qū)引入緩沖的目的引入緩沖的目的是解決是解決CPU的運(yùn)行速度和外設(shè)操作速度的運(yùn)行速度和外設(shè)操作速度不匹配的矛盾。如輸出時先寫入緩沖區(qū),再成批輸出。不匹配的矛盾。如輸出時先寫入緩沖區(qū),再成批輸出。成批寫出數(shù)據(jù)比一個一個寫出數(shù)據(jù)節(jié)約時間。成批寫出數(shù)據(jù)比一個一個寫出數(shù)據(jù)節(jié)約時間。第4頁/共65頁14.2 輸入輸出流類體系輸入輸出流類體系14.2.1 基本輸入輸出流類體系基本輸入輸出流類體系C+預(yù)預(yù)定義了流類,用于完成數(shù)據(jù)的定義了流類,用于完成數(shù)據(jù)的“流動流動”(輸入輸出輸入輸出)iosistreamiostreamostreamstreamb

5、ufistream_withassignostream_withassign流基類通用輸入流基類通用輸出流基類通用輸入輸出流類基類cin所屬的輸入流類cout、cerr、clog所屬的輸出流類抽象緩沖區(qū)基類在這些已定義的類中,給出了若干方法(成員函數(shù)),用于控制輸入輸出。第5頁/共65頁使用上述流類,必須包含頭文件使用上述流類,必須包含頭文件 “ iostream.h”14.2.2 用運(yùn)算符重載實現(xiàn)標(biāo)準(zhǔn)設(shè)備的輸入輸出用運(yùn)算符重載實現(xiàn)標(biāo)準(zhǔn)設(shè)備的輸入輸出觀察頭文件觀察頭文件istream.h :class istream : virtual public ios public:istream&am

6、p; operator(char *); /A 字符串字符串輸入重載函數(shù)輸入重載函數(shù)istream& operator(char &); /B 字符字符輸入重載函數(shù)輸入重載函數(shù)istream& operator(int &); /C 整數(shù)整數(shù)輸入重載函數(shù)輸入重載函數(shù)istream& operator(double &); /D 實型實型數(shù)據(jù)輸入重載函數(shù)數(shù)據(jù)輸入重載函數(shù);C+ 對基本的數(shù)據(jù)類型,均定義了重載運(yùn)算符對基本的數(shù)據(jù)類型,均定義了重載運(yùn)算符 將將右移右移位運(yùn)算符位運(yùn)算符 重載為重載為 提取提取 運(yùn)算符運(yùn)算符第6頁/共65頁class ist

7、ream_withassign : public istream ;extern istream_withassign cin;cin 是是 istream_withassign 類對象,繼承了重載運(yùn)算符類對象,繼承了重載運(yùn)算符。編譯器會將編譯器會將 cinxy; 解釋成解釋成 (cin.operator(x) .operator(y); 返回返回 cin第7頁/共65頁同理:同理:C+還定義了三個還定義了三個輸出流對象輸出流對象 cout、cerr 和和 clog。這三個對象均是這三個對象均是ostream_withassign類的對象,類的對象,它們均在頭文件它們均在頭文件ostream.

8、h中被定義中被定義 cin 標(biāo)準(zhǔn)輸入流標(biāo)準(zhǔn)輸入流(輸入設(shè)備是鍵盤輸入設(shè)備是鍵盤) cout 標(biāo)準(zhǔn)輸出流標(biāo)準(zhǔn)輸出流(輸出設(shè)備是顯示器輸出設(shè)備是顯示器) cerr 標(biāo)準(zhǔn)錯誤輸出流,沒有緩沖,立刻輸出。標(biāo)準(zhǔn)錯誤輸出流,沒有緩沖,立刻輸出。 clog 輸出日志信息,有緩沖,緩沖區(qū)滿后被輸出。輸出日志信息,有緩沖,緩沖區(qū)滿后被輸出。同理在同理在ostream類中類中重載了重載了 運(yùn)算符運(yùn)算符編譯器會將編譯器會將 coutxy; 解釋成解釋成 (cout.operator(x) .operator(y); 返回返回 cout第8頁/共65頁例例14.2 使用使用cout、cerr和和clog #inclu

9、de #include void main( ) double x; coutx; if(x0) cerrx is not a positive number!n; /B return; clogThe root of x is sqrt(x)endl; /C 在本例中,cout、cerr和clog的作用相同。而cerr和clog的區(qū)別在于,cerr是非緩沖輸出,而clog是緩沖輸出。請看例14.3:第9頁/共65頁例例14.3 體會體會cerr和和clog的區(qū)別的區(qū)別 #include void main( )double x;clogx;coutxendl; /B此程序在屏幕上的運(yùn)行過程如

10、下:此程序在屏幕上的運(yùn)行過程如下:5 /輸入輸入 5 /B行的輸出行的輸出 Please input x: /A行的輸出行的輸出 原因:clog是緩沖輸出,當(dāng)緩沖區(qū)滿或程序結(jié)束時, 才“真正”輸出到屏幕上。第10頁/共65頁14.2.3 缺省的輸入輸出格式缺省的輸入輸出格式1缺省的(默認(rèn)的)輸入格式缺省的(默認(rèn)的)輸入格式 cin 是緩沖流,當(dāng)輸入一行結(jié)束按回車(是緩沖流,當(dāng)輸入一行結(jié)束按回車(Enter)時,)時, 操作系統(tǒng)將輸入內(nèi)容放入輸入緩沖區(qū),操作系統(tǒng)將輸入內(nèi)容放入輸入緩沖區(qū), 然后然后 cin 從輸入緩沖區(qū)提取數(shù)據(jù)。從輸入緩沖區(qū)提取數(shù)據(jù)。輸入數(shù)據(jù)時,在缺省的情況下,數(shù)據(jù)之間的分隔符為

11、:輸入數(shù)據(jù)時,在缺省的情況下,數(shù)據(jù)之間的分隔符為:鍵(空格鍵)、鍵(空格鍵)、鍵(制表鍵)或鍵(制表鍵)或鍵(回車鍵),這三個鍵通稱為空白字符。鍵(回車鍵),這三個鍵通稱為空白字符。 輸入數(shù)據(jù)的類型必須與提取數(shù)據(jù)的變量類型一致。輸入數(shù)據(jù)的類型必須與提取數(shù)據(jù)的變量類型一致。第11頁/共65頁如:如:char c1, c2, c3; cinc1c2c3;程序運(yùn)行時,可輸入:程序運(yùn)行時,可輸入:abc 也可輸入:也可輸入:ab c 或輸入:或輸入:a b c 在上述情況下,在上述情況下,三個變量三個變量c1、c2和和c3獲得值均為獲得值均為 a、b 和和 c。應(yīng)注意,最后輸入的總是回車鍵。應(yīng)注意,最

12、后輸入的總是回車鍵。 第12頁/共65頁又如:又如:char s120, s220; cins1s2; 輸入輸入abcd 或輸入或輸入abcd 或輸入或輸入abcd結(jié)果字符串結(jié)果字符串s1和和s2提取的值均分別為提取的值均分別為ab和和cd。 回車回車 起兩個作用:起兩個作用: 表示一行結(jié)束,可進(jìn)行提取操作了。表示一行結(jié)束,可進(jìn)行提取操作了。 可用它做數(shù)據(jù)分隔符。可用它做數(shù)據(jù)分隔符。第13頁/共65頁不同類型數(shù)據(jù)的輸出有其缺省的不同類型數(shù)據(jù)的輸出有其缺省的(默認(rèn)的默認(rèn)的)輸出格式:輸出格式:輸出整型數(shù):十進(jìn)制、域?qū)挒檩敵稣蛿?shù):十進(jìn)制、域?qū)挒?、右對齊、空格填充。、右對齊、空格填充。輸出實型數(shù)

13、:精度輸出實型數(shù):精度6位、浮點(diǎn)輸出、位、浮點(diǎn)輸出、 域?qū)挒橛驅(qū)挒?、右對齊、空格填充。、右對齊、空格填充。 若整數(shù)部分超過若整數(shù)部分超過7 位或有效數(shù)字在小數(shù)點(diǎn)后第位或有效數(shù)字在小數(shù)點(diǎn)后第4 位之后,位之后, 自動轉(zhuǎn)為科學(xué)計數(shù)法格式輸出。自動轉(zhuǎn)為科學(xué)計數(shù)法格式輸出。若數(shù)的實際寬度超過域?qū)?,則按實際長度輸出。輸出字符或字符串:域?qū)挒檩敵鲎址蜃址河驅(qū)挒?、右對齊、空格填充。、右對齊、空格填充。 14.2.3 缺省的輸入輸出格式缺省的輸入輸出格式2缺省的(默認(rèn)的)輸出格式缺省的(默認(rèn)的)輸出格式 第14頁/共65頁例例14.4 標(biāo)準(zhǔn)輸出的默認(rèn)輸出格式標(biāo)準(zhǔn)輸出的默認(rèn)輸出格式#include #

14、include void main( )double d1=12.3456789, d2=123456.789, d3=0.0000123456;coutd1,d2,d3endl;coutsetw(10)d1,setw(10)d2, setw(10)d3endl;char s10=abcd, c=k;couts,setw(4)cendl;輸出結(jié)果:輸出結(jié)果:12.3457, 123457, 1.23456e-00512.3457, 123457, 1.23456e-005abcd, k 注意注意:表示空格表示空格第15頁/共65頁缺省的輸入輸出格式都可以改變:具體方法有兩種缺省的輸入輸出格式都

15、可以改變:具體方法有兩種。14.3.1 使用成員函數(shù)進(jìn)行格式控制使用成員函數(shù)進(jìn)行格式控制 在在 ios 類中,定義了一個類中,定義了一個公有的公有的無名枚舉成員,無名枚舉成員,用于進(jìn)行輸入輸出格式控制。用于進(jìn)行輸入輸出格式控制。完整內(nèi)容見完整內(nèi)容見 “第第14章章 輸入輸出流輸入輸出流(例子例子).doc”或教材?;蚪滩?。enum / 部分內(nèi)容如下,含義見表部分內(nèi)容如下,含義見表141。 skipws=0 x0001, /跳過輸入中的空白字符跳過輸入中的空白字符 I . dec=0 x0010, /將數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制數(shù)將數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制數(shù) I/O oct=0 x0020, /將數(shù)據(jù)轉(zhuǎn)換成八進(jìn)制

16、數(shù)將數(shù)據(jù)轉(zhuǎn)換成八進(jìn)制數(shù) I/O hex=0 x0040, /將數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù)將數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù) I/O showbase=0 x0080, /輸出時帶有一個表示數(shù)制的字符輸出時帶有一個表示數(shù)制的字符 O .;14.3 輸入輸出格式控制 訪問這些枚舉常量:訪問這些枚舉常量:ios:skipwsios:dec、 ios:oct 、 ios:hexios:showbase 等等等等第16頁/共65頁在ios.h中的定義形式:static const long basefield; / dec | oct | hexstatic const long adjustfield; / left

17、| right | internalstatic const long floatfield; / scientific | fixed另外,另外,ios 類有靜態(tài)成員:類有靜態(tài)成員:basefield 其值為其值為 dec | oct | hex adjustfield 其值為其值為 left | right | internalfloatfield 其值為其值為 scientific | fixed 第17頁/共65頁class _CRTIMP ios public:protected: int state; / 輸入輸出流出錯狀態(tài)字輸入輸出流出錯狀態(tài)字(其使用見其使用見14.8節(jié)節(jié)) l

18、ong x_flags; / 輸入輸出格式狀態(tài)字輸入輸出格式狀態(tài)字 int x_precision; / 輸入輸出精度輸入輸出精度 char x_fill; / 填充字符填充字符 int x_width; / 輸出數(shù)據(jù)的域?qū)捿敵鰯?shù)據(jù)的域?qū)?.;C+系統(tǒng)提供了若干公有成員函數(shù),對 x_flags、x_precision、x_fill 和 x_width 進(jìn)行設(shè)置,并依據(jù)這些設(shè)置來控制不同的輸入輸出格式。第18頁/共65頁在在 ios 類中,定義了一個類中,定義了一個保護(hù)的保護(hù)的長整型成員,長整型成員,稱為輸入輸出稱為輸入輸出狀態(tài)標(biāo)志字狀態(tài)標(biāo)志字: protected: long x_flag;x

19、_flag 是是32位的位的(實際只用了低實際只用了低16位位),其每一個二進(jìn)制位代表一種狀態(tài),其每一個二進(jìn)制位代表一種狀態(tài),系統(tǒng)按照系統(tǒng)按照 x_flag 中指定的狀態(tài)進(jìn)行輸入輸出。中指定的狀態(tài)進(jìn)行輸入輸出。 . XXXX XXXX XXXX XXXXx_flagios:skipws=0 x0001 代表該位代表該位上述每個枚舉常量代表一種輸入輸出狀態(tài)。例:上述每個枚舉常量代表一種輸入輸出狀態(tài)。例:如果該位的值是如果該位的值是1(該位的缺省值是(該位的缺省值是1 ),),則輸入時,跳過輸入數(shù)據(jù)中的空白字符。則輸入時,跳過輸入數(shù)據(jù)中的空白字符。第19頁/共65頁 . XXXX XXXX XXX

20、X XXXXx_flag 經(jīng)常用多個枚舉常量組合成一個狀態(tài)標(biāo)志字,經(jīng)常用多個枚舉常量組合成一個狀態(tài)標(biāo)志字,用于控制輸入輸出格式,例用于控制輸入輸出格式,例: ios:oct | ios:showbase組合出組合出 x-flag :. 0000 0000 1010 0000 0 x00A0表示按八進(jìn)制輸出表示按八進(jìn)制輸出 ,并輸出表示八進(jìn)制數(shù)的前導(dǎo),并輸出表示八進(jìn)制數(shù)的前導(dǎo)0ios:dec=0 x0010 代表該位代表該位表示按十進(jìn)制輸出表示按十進(jìn)制輸出ios:oct=0 x0020 代表該位代表該位表示按八進(jìn)制輸出表示按八進(jìn)制輸出ios:hex =0 x0040 代表該位代表該位表示按十六進(jìn)

21、制輸出表示按十六進(jìn)制輸出ios:showbase=0 x0080 代表該位代表該位表示輸出數(shù)字前導(dǎo)字符表示輸出數(shù)字前導(dǎo)字符第20頁/共65頁因為因為 x_flag 是是ios類保護(hù)成員,類保護(hù)成員,ios類的派生類對類的派生類對象象 cin、cout等等不能直接訪問它,所以不能直接訪問它,所以 ios 類提供類提供了一些公有成員函數(shù)來設(shè)置了一些公有成員函數(shù)來設(shè)置 x_flag 的各個狀態(tài)位的各個狀態(tài)位 。 (見表見表14-2 )下面舉例:第21頁/共65頁原因:缺省狀態(tài)下, ios:skipws值為1,空白字符: n 空格。例例14.6:使用成員函數(shù),控制輸入時是否提取空白字符:使用成員函數(shù),

22、控制輸入時是否提取空白字符#include void main( ) char c, str80; int i=0; cin c ; while( c!=n ) stri+=c ; cin c ; stri=0; cout str endl;運(yùn)行時輸入運(yùn)行時輸入:abcdefghij. 運(yùn)行狀況如何?運(yùn)行狀況如何?跟蹤調(diào)試發(fā)現(xiàn):跟蹤調(diào)試發(fā)現(xiàn):cin c ; 不提取不提取n解決辦法:解決辦法:在此位置加入語句:在此位置加入語句: cin.unsetf(ios:skipws);實際: 永遠(yuǎn)不停第22頁/共65頁例例14.7 使用成員函數(shù),控制輸入格式使用成員函數(shù),控制輸入格式#include vo

23、id main( ) char c1, c2, c3; cin.unsetf(ios:skipws); /設(shè)置不跳過空白字符設(shè)置不跳過空白字符 cinc1c2c3; coutc1c2c3#xy; coutx,yendl;運(yùn)行結(jié)果:運(yùn)行結(jié)果:a b c /輸入的輸入的a,b,c之間分別有一個空格之間分別有一個空格a b#10 20 /輸入輸入12, 16第23頁/共65頁14.3.2 使用操縱算子進(jìn)行格式控制使用操縱算子進(jìn)行格式控制在在 iomanip.h 中預(yù)定義了一些操縱算子,中預(yù)定義了一些操縱算子,表表14-3,用于控制流格式。用于控制流格式。常用的有常用的有 dec、oct、hex、ws

24、、endl、flush、setw( )第24頁/共65頁例例14.9 使用操縱算子控制輸入輸出格式使用操縱算子控制輸入輸出格式 #include #include /必須要包含此頭文件必須要包含此頭文件void main( ) int x, y, a, b; cinhexxy; cinoctab; coutsetw(8)setfill(*)x, setfill($)setw(4)yendl; coutsetiosflags(ios:left) a,setw(8)bendl; 運(yùn)行結(jié)果:運(yùn)行結(jié)果:10 2010 20*16,$328,16$第25頁/共65頁例例14.11 使用操縱算子控制浮點(diǎn)數(shù)

25、的輸出精度。使用操縱算子控制浮點(diǎn)數(shù)的輸出精度。#include #include void main( )double x=12.3456789;coutxendl;coutsetprecision(4)xendl;cout.setf(ios:fixed, ios:floatfield); /設(shè)置以定點(diǎn)數(shù)格式輸出設(shè)置以定點(diǎn)數(shù)格式輸出coutxendl;cout.setf(ios:scientific, ios:floatfield); /設(shè)置以科學(xué)表示法格式輸出設(shè)置以科學(xué)表示法格式輸出coutsetprecision(2)xendl;運(yùn)行結(jié)果:運(yùn)行結(jié)果:12.3457 /6位有效數(shù)字位有效數(shù)字

26、12.35 /4位有效數(shù)字位有效數(shù)字12.3457 /小數(shù)點(diǎn)后小數(shù)點(diǎn)后4位數(shù)字位數(shù)字1.23e+001 /小數(shù)點(diǎn)后小數(shù)點(diǎn)后2位數(shù)字位數(shù)字第26頁/共65頁14.4 用成員函數(shù)實現(xiàn)輸入輸出用成員函數(shù)實現(xiàn)輸入輸出 14.4.1 輸出函數(shù)輸出函數(shù) 在在ostream類中定義了一些公有成員函數(shù),用于輸出。類中定義了一些公有成員函數(shù),用于輸出。ostream & ostream:put(char );ostream & ostream:put(unsigned char );ostream & ostream:put(signed char );ostream & ost

27、ream:write(const char *, int);ostream & ostream:write(const unsigned char *, int);ostream & ostream:write(const signed char *, int);ostream& flush( ); /刷新輸出流刷新輸出流 例:例:int i=97; cout.put( char(i) ); char c=*; cout.put( c ); cout.write(abcd, 2);運(yùn)行結(jié)果:運(yùn)行結(jié)果:a*ab表示輸出字符串前 n 個字符第27頁/共65頁int istr

28、eam:get( );istream & istream:get(char &);istream & istream:get(unsigned char &);istream & istream:get(signed char &);istream & istream:get(char *, int , char=n);istream & istream:get(unsigned char *, int , char=n);istream & istream:get(signed char *, int , char=n)

29、;istream & istream:getline(char *, int , char=n);istream & istream:getline(unsigned char *, int , char=n);istream & istream:getline(signed char *, int , char=n);14.4.2 輸入函數(shù)輸入函數(shù)在在istream類中定義了一些公有成員函數(shù),控制輸入。類中定義了一些公有成員函數(shù),控制輸入。 注意注意 get( ) 和和 getline( ) 的區(qū)別!的區(qū)別!第28頁/共65頁例:例: 讀取字符和字符串讀取字符和字符串

30、void main( ) char c1, c2, c3; char str180, str2100; cout輸入三個字符輸入三個字符:; c1=cin.get( ); cin.get(c2); cin.get(c3); cin.get( ); cout輸入第一行字符串輸入第一行字符串:; cin.get(str1,80); cin.get( ); cout輸入第二行字符串輸入第二行字符串:; cin.getline(str2,80);運(yùn)行:運(yùn)行:abccomputeroperator/讀取第一行后的回車讀取第一行后的回車/讀取第二行后的回車讀取第二行后的回車/第三行后的回車自動被提取第三行

31、后的回車自動被提取第29頁/共65頁續(xù):續(xù): cout.put(c1).put(c2).put(c3).put(n); cout.write(str1, 3); cout.write(str2, strlen(str2); cout.put(n);輸出結(jié)果:abccomoperator第30頁/共65頁例例14.14 輸入成員函數(shù)的使用輸入成員函數(shù)的使用 #include #include void main( ) char buf20, max20; int cnum, mc=0; while(cin.getline(buf, 20) / A 提取一行字符,讀取并舍棄行尾標(biāo)志提取一行字符,讀

32、取并舍棄行尾標(biāo)志n cnum = cin.gcount( ); / B 獲取獲取A行的行的getline( )實際讀取的字符個數(shù)實際讀取的字符個數(shù)if(cnummc) mc=cnum; strcpy(max, buf); coutlen=cnum-1,bufendl; / C coutmax len=mc-1,maxendl; / D第31頁/共65頁程序的運(yùn)行狀況是:程序的運(yùn)行狀況是:an applelen=8, an applevery goodlen=9, very goodpear? len=5, pear?ok! len=3, ok!Z /輸入輸入Ctrl+z,表示輸入流結(jié)束。,表示

33、輸入流結(jié)束。max len=9, very good程序功能:輸入若干行字符(假定每行少于20個字符),輸出每行的字符個數(shù),最后將最長的行及其長度輸出。 第32頁/共65頁14.5 重載插入和提取運(yùn)算符重載插入和提取運(yùn)算符 istream 和和 ostream 類對標(biāo)準(zhǔn)類對標(biāo)準(zhǔn)數(shù)據(jù)類型,數(shù)據(jù)類型,已已定義了定義了 重載運(yùn)算符重載運(yùn)算符: 提取運(yùn)算符提取運(yùn)算符 和和 插入運(yùn)算符插入運(yùn)算符 和和 c1 ; cout 和和 x; 則自動解釋成則自動解釋成 cin.operator(x);第33頁/共65頁例例14.18 用友元函數(shù)實現(xiàn)復(fù)數(shù)類對象用友元函數(shù)實現(xiàn)復(fù)數(shù)類對象 插入和提取運(yùn)算符重載函數(shù)插入和

34、提取運(yùn)算符重載函數(shù) 程序見程序見 “第第14章章 輸入輸出流輸入輸出流(例子例子).doc”或教材?;蚪滩?。第34頁/共65頁14.6 文件流類文件流類 前已述,前已述,“文件文件”指指:(1) 磁盤文件磁盤文件(2) 設(shè)備文件設(shè)備文件(如鍵盤、顯示器、打印機(jī)等如鍵盤、顯示器、打印機(jī)等)本節(jié)特別介紹:本節(jié)特別介紹: 磁盤文件磁盤文件文本文件文本文件中存放的是中存放的是“文本流文本流”- 一串一串 ASCII 字符字符二進(jìn)制文件二進(jìn)制文件中存放的是中存放的是“二進(jìn)制流二進(jìn)制流” - 按內(nèi)存的二進(jìn)制格式存放(內(nèi)存映象)按內(nèi)存的二進(jìn)制格式存放(內(nèi)存映象)在在“流流”中的數(shù)據(jù)是以字節(jié)為單位的。中的數(shù)據(jù)

35、是以字節(jié)為單位的。文件操作是指對文件中的內(nèi)容進(jìn)行讀寫。文件操作是指對文件中的內(nèi)容進(jìn)行讀寫。第35頁/共65頁14.6.1 文件流類體系文件流類體系在在流類流類體系中,包含體系中,包含文件流類文件流類體系體系iosistreamiostreamostreamstreambufifstreamofstreamfstreamfilebuf完成從文件提取數(shù)據(jù)完成向文件插入數(shù)據(jù)完成提取插入操作完成文件緩沖區(qū)管理第36頁/共65頁14.6.2 文件的打開和關(guān)閉文件的打開和關(guān)閉 文件的使用過程如下:文件的使用過程如下:(1) 定義一個文件流對象定義一個文件流對象(2) 打開文件打開文件(3) 對文件進(jìn)行讀寫

36、操作對文件進(jìn)行讀寫操作(4) 關(guān)閉文件關(guān)閉文件1. 定義一個文件流對象定義一個文件流對象 如:如:ifstream infile; /用于與一個用于與一個輸入輸入文件建立聯(lián)系文件建立聯(lián)系 ofstream outfile; /用于與一個用于與一個輸出輸出文件建立聯(lián)系文件建立聯(lián)系 fstream iofile; /用于與一個用于與一個輸入輸出輸入輸出文件建立聯(lián)系文件建立聯(lián)系使用文件流類,使用文件流類,必須包含頭文件必須包含頭文件“fstream.h”第37頁/共65頁如:如:infile.open(“myfile1.txt”); /打開打開 myfile1.txt 用于讀用于讀 outfile.

37、open(“myfile2.txt”); /打開打開 myfile2.txt 用于寫用于寫 iofile.open(“myfile3.txt”, ios:in| ios:out); /打開打開 myfile3.txt 用于讀寫用于讀寫ifstream infile;infile.open(“myfile1.txt”);ifstream infile(“myfile1.txt”);定義流對象和打開文件可合二為一:定義流對象和打開文件可合二為一:調(diào)用調(diào)用成員成員函數(shù)函數(shù)打開文件。打開文件。調(diào)用調(diào)用構(gòu)造構(gòu)造函數(shù)函數(shù)打開文件。打開文件。2. 打開文件open( ) 函數(shù)格式第38頁/共65頁打開文件成

38、員函數(shù)打開文件成員函數(shù) 格式:格式:void fstream:open(const char *, int, int=filebuf:openprot);void ifstream:open(const char *, int=ios:in, int=filebuf:openprot);void ofstream:open(const char *, int=ios:out, int=filebuf:openprot);打開的文件名文件的打開方式參數(shù) ios: 意義第39頁/共65頁在在 ios 類中,定義了一個類中,定義了一個公有的公有的無名枚舉成員,無名枚舉成員,用于定義文件的打開方式。用

39、于定義文件的打開方式。enum open_modein=0 x01, /按按讀讀方式打開文件方式打開文件out=0 x02, /按按寫寫方式打開文件方式打開文件ate=0 x04, app=0 x08, /按按增補(bǔ)增補(bǔ)(追加追加)方式打開文件方式打開文件trunc=0 x10, nocreate=0 x20,noplace=0 x40, binary=0 x80, /打開打開二進(jìn)制二進(jìn)制文件文件;引用方式為:引用方式為:ios:in ios:outios:in|ios:binary ios:out |ios:binary 等等等等第40頁/共65頁與與 cin 和和 cout 的用法相同的用法

40、相同 如:如:infile x; outfile y;3. 對文件進(jìn)行讀寫操作在對文件進(jìn)行讀寫時,我們將文件看成在對文件進(jìn)行讀寫時,我們將文件看成字符流字符流, 文件流文件流 讀寫位置指針讀寫位置指針隨著文件的讀寫,指針移動。隨著文件的讀寫,指針移動。 第41頁/共65頁4. 關(guān)閉文件關(guān)閉文件void ifstream:close( );void ofstream:close( );void fstream:close( );如:如:infile.close( ); /切斷與輸入文件切斷與輸入文件 myfile1.txt 的聯(lián)系的聯(lián)系 outfile.close( ); /切斷與輸出文件切斷與

41、輸出文件 myfile2.txt 的聯(lián)系的聯(lián)系 iofile.close( ); /切斷與輸入輸出文件切斷與輸入輸出文件 myfile3.txt 的聯(lián)系的聯(lián)系文件讀寫完畢,必須關(guān)閉。 關(guān)閉文件成員函數(shù) 格式 :第42頁/共65頁14.6.3 文本文件的讀寫文本文件的讀寫例例 14.21 將數(shù)值將數(shù)值1100及其平方根寫入文件及其平方根寫入文件 sqrttable.txt #include #include #include void main( ) double x; ofstream out; / 定義一個輸出流對象定義一個輸出流對象 out.open(sqrttable.txt); / 打

42、開文本文件打開文本文件sqrttable.txt for(x=1; x=100; x+)outxtsqrt(x)endl; / 將結(jié)果寫入文件將結(jié)果寫入文件 out.close( ); / 關(guān)閉文件關(guān)閉文件演示并察看結(jié)果文件第43頁/共65頁例例 14.22 編寫一個程序,用于顯示一個文本文件編寫一個程序,用于顯示一個文本文件 #include #include #include void main( )char filename40, line80;ifstream infile; coutfilename; / A infile.open(filename); / B 第44頁/共65頁i

43、f(!infile) coutCan not open file: filenameendl;exit(1);while(infile.getline(line, 80) / 讀入一行讀入一行coutlinech) / 讀入一個字符讀入一個字符 coutch; / 顯示一個字符顯示一個字符演示第45頁/共65頁例例 14.24 編一個程序用于復(fù)制文本文件編一個程序用于復(fù)制文本文件 程序見程序見 “第第14章章 輸入輸出流輸入輸出流(例子例子).doc”或教材?;蚪滩?。演示例例 14.25 從一個文本文件從一個文本文件source.txt中讀入若干整數(shù),中讀入若干整數(shù), 用選擇法將這些數(shù)據(jù)排成升

44、序,用選擇法將這些數(shù)據(jù)排成升序, 將排序后的結(jié)果寫入將排序后的結(jié)果寫入 另一個文件文本文件另一個文件文本文件target.txt中中事前準(zhǔn)備數(shù)據(jù)文件:事前準(zhǔn)備數(shù)據(jù)文件: source.txt 程序見程序見 “第第14章章 輸入輸出流輸入輸出流(例子例子).doc”或教材。或教材。演示第46頁/共65頁14.6.4 二進(jìn)制文件的讀寫二進(jìn)制文件的讀寫 1. 文件的讀寫操作(成塊讀寫)文件的讀寫操作(成塊讀寫)成員函數(shù):成員函數(shù):istream & istream:read( char *, int );istream & istream:read( unsigned char *,

45、 int );istream & istream:read( signed char *, int );ostream & ostream:write( const char *, int );ostream & ostream:write( const unsigned char *, int );ostream & ostream:write( const signed char *, int );前三個為讀取操作前三個為讀取操作:將第二個參數(shù)指定的字節(jié)數(shù)讀入到:將第二個參數(shù)指定的字節(jié)數(shù)讀入到 以第一個參數(shù)為起始地址的內(nèi)存中。以第一個參數(shù)為起始地址的內(nèi)存中。

46、 后三個為寫操作后三個為寫操作:從第一個參數(shù)為起始地址的內(nèi)存開始,:從第一個參數(shù)為起始地址的內(nèi)存開始, 將連續(xù)的第二個參數(shù)指定字節(jié)數(shù)的將連續(xù)的第二個參數(shù)指定字節(jié)數(shù)的 內(nèi)容寫到文件中。內(nèi)容寫到文件中。 第47頁/共65頁例例 14.28 讀入文本文件讀入文本文件data.txt 中的數(shù)據(jù),中的數(shù)據(jù), 寫入二進(jìn)制文件寫入二進(jìn)制文件data.bin中中 。假定文本文件data.txt的內(nèi)容如下 1 2 4 6 9 10 11 15 程序見 “第14章 輸入輸出流(例子).doc”或教材。例例 14.27 從鍵盤輸入若干學(xué)生的信息,寫入二進(jìn)制文件,從鍵盤輸入若干學(xué)生的信息,寫入二進(jìn)制文件,再從該二進(jìn)制

47、文件中讀出學(xué)生的信息,輸出到屏幕上。再從該二進(jìn)制文件中讀出學(xué)生的信息,輸出到屏幕上。 程序見 “第14章 輸入輸出流(例子).doc”或教材。第48頁/共65頁14.7 文件的隨機(jī)訪問文件的隨機(jī)訪問.文件內(nèi)容文件內(nèi)容讀寫位置指針讀寫位置指針讀寫數(shù)據(jù)后自動移動讀寫數(shù)據(jù)后自動移動讀寫位置指針讀寫位置指針istream類和類和ostream類類提供成員函數(shù)提供成員函數(shù) ,控制讀寫位置指針的移動,控制讀寫位置指針的移動,實現(xiàn)文件的隨機(jī)讀寫。實現(xiàn)文件的隨機(jī)讀寫。文件剛打開時:文件剛打開時:第49頁/共65頁控制讀寫位置指針的成員函數(shù):控制讀寫位置指針的成員函數(shù):istream & istream

48、:seekg( streampos ); istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg( );ostream & ostream:seekp( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp( );前三個:適用于輸入文件前三個:適用于輸入文件 get 后三個:適用于輸出文件后三個:適用于輸出文件 put其中其中: 在在

49、ios 類中定義類中定義 typedef long streamoff ; /offset typedef long streampos; /position所以所以, 本質(zhì)上本質(zhì)上, streamoff 和和 streampos 就是就是long 類型類型第50頁/共65頁控制讀寫位置指針的成員函數(shù):控制讀寫位置指針的成員函數(shù):istream & istream:seekg( streampos ); istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg( );ostr

50、eam & ostream:seekp( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp( );另外,在另外,在 ios 類中定義枚舉類型:類中定義枚舉類型: enum seek_dir beg=0, /文件開始處,使用文件開始處,使用 ios:beg cur=1, /當(dāng)前位置,當(dāng)前位置, 使用使用 ios:cur end=2 /文件結(jié)束處,使用文件結(jié)束處,使用 ios:end;用于指定移動文件用于指定移動文件指針時的參照點(diǎn)。指針時的參照點(diǎn)。

51、第51頁/共65頁控制讀寫位置指針的成員函數(shù):控制讀寫位置指針的成員函數(shù):istream & istream:seekg( streampos );istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg( );ostream & ostream:seekp( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp( );表示將指針

52、表示將指針絕對移動絕對移動到到 streampos 字節(jié)處。字節(jié)處。按按ios:seek_dir指定的參照點(diǎn)位置,指定的參照點(diǎn)位置,將指針相對將指針相對移動移動到到 streamoff 字節(jié)處。字節(jié)處。返回指針的當(dāng)前位置返回指針的當(dāng)前位置(相對于文件開始的相對于文件開始的字節(jié)數(shù)字節(jié)數(shù))。同理得出后三個函數(shù)的功能!同理得出后三個函數(shù)的功能!第52頁/共65頁例例 14.29 將將Fibonnaci數(shù)列的前數(shù)列的前40項寫入二進(jìn)制文件項寫入二進(jìn)制文件fib.bin中,然后輸出其中的奇數(shù)項,每行輸出中,然后輸出其中的奇數(shù)項,每行輸出5個數(shù)。個數(shù)。 #include #include #include

53、 #include void main( )fstream iofile(fib.bin, ios:in|ios:out|ios:binary); if(!iofile) coutCan not open file: fib.binendl;exit(1); 第53頁/共65頁例例 14.29 續(xù)續(xù)1 streampos pos = iofile.tellp( ); coutBegin posi=posendl;int f1=1, f2=1;for(int i=0; i20; i+)iofile.write(char*)&f1, sizeof(int);iofile.write(cha

54、r*)&f2, sizeof(int);f1=f1+f2;f2=f2+f1;pos=iofile.tellp( ); /獲取當(dāng)前位置獲取當(dāng)前位置coutEnd posi=posendl;第54頁/共65頁例例 14.29 續(xù)續(xù)2 iofile.seekp(0, ios:beg); /將讀寫位置指針重新定位于文件起始位置將讀寫位置指針重新定位于文件起始位置 for(i=0; i20; i+)iofile.read(char*)&f1, sizeof(int); /讀入讀入iofile.seekg(sizeof(int), ios:cur); /移動移動coutsetw(10)f1

55、;if(i+1)%4=0) coutendl;iofile.close( );第55頁/共65頁14.8 輸入輸出流的出錯處理輸入輸出流的出錯處理 ios類中,有一個類中,有一個輸入輸出輸入輸出出錯狀態(tài)字出錯狀態(tài)字state,各狀態(tài)位由各狀態(tài)位由ios類中定義的枚舉常量來表示:類中定義的枚舉常量來表示:enum io_state goodbit = 0 x00, / 表示狀態(tài)正常表示狀態(tài)正常 eofbit = 0 x01, / 表示達(dá)到了文件結(jié)尾表示達(dá)到了文件結(jié)尾 failbit = 0 x02, / 表示表示I/O操作失敗操作失敗 badbit = 0 x04 / 表示試圖進(jìn)行非法操作表示試

56、圖進(jìn)行非法操作 ; 在使用流進(jìn)行輸入輸出操作時,可能會出現(xiàn)一些錯誤。在使用流進(jìn)行輸入輸出操作時,可能會出現(xiàn)一些錯誤。如當(dāng)程序中需要輸入整型數(shù)時,在輸入流中卻出現(xiàn)了如當(dāng)程序中需要輸入整型數(shù)時,在輸入流中卻出現(xiàn)了字符。字符。 C+提供一套類機(jī)制,用于檢測輸入輸出流狀態(tài),以提供一套類機(jī)制,用于檢測輸入輸出流狀態(tài),以發(fā)現(xiàn)錯誤并清除錯誤狀態(tài)。發(fā)現(xiàn)錯誤并清除錯誤狀態(tài)。 第56頁/共65頁ios 類提供了幾個內(nèi)聯(lián)函數(shù),用于完成查看狀態(tài)字類提供了幾個內(nèi)聯(lián)函數(shù),用于完成查看狀態(tài)字state中中的各個狀態(tài)位、清除狀態(tài)字等工作。的各個狀態(tài)位、清除狀態(tài)字等工作。各函數(shù)的功能是:各函數(shù)的功能是: rdstate( )

57、返回當(dāng)前狀態(tài)字返回當(dāng)前狀態(tài)字operator!( ) ! 運(yùn)算符重載,與運(yùn)算符重載,與fail( )函數(shù)功能相同函數(shù)功能相同bad( ) 如果如果badbit被置位,返回真,否則返回假被置位,返回真,否則返回假clear(int _i=0) 用參數(shù)用參數(shù) _i 置新的狀態(tài)字置新的狀態(tài)字eof( ) 如果如果eofbit被置位,返回真,否則返回假被置位,返回真,否則返回假fail( ) 如果如果badbit或或failbit被置位被置位,返回真返回真,否則返回假否則返回假good( ) 如果無任何錯誤返回真,否則返回假如果無任何錯誤返回真,否則返回假第57頁/共65頁例例14.31 出錯處理函數(shù)

58、的使用出錯處理函數(shù)的使用#include void main( ) double aver = 0, a5; char temp80; for(int i=0; i5; i+) cout請輸入第請輸入第i+1 ai; while(cin.rdstate( ) / 若遇到錯誤若遇到錯誤 cin.clear( ); / 清除出錯狀態(tài),清除出錯狀態(tài), 但錯誤的輸入依然留在輸入緩沖區(qū)中但錯誤的輸入依然留在輸入緩沖區(qū)中 cin.getline(temp,80); / 將緩沖區(qū)中的錯誤輸入連同將緩沖區(qū)中的錯誤輸入連同 回車一起讀入到回車一起讀入到temp,丟棄,丟棄第58頁/共65頁 couttemp為非法輸入為非法輸入!n; cout請重新輸入第請重新輸入第i+1ai;aver += ai;

溫馨提示

  • 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

提交評論