




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1第第1010章章 流類庫與輸入輸出流類庫與輸入輸出10.1 10.1 流、文件以及流、文件以及c+c+的基本流類和文件流類系統(tǒng)的基本流類和文件流類系統(tǒng)* *10.2 10.2 插入與提取運算符的重載插入與提取運算符的重載10.3 10.3 對輸入輸出格式進行控制對輸入輸出格式進行控制10.4 10.4 使用預(yù)定義的插入與提取運算符對文件流進行讀寫操作使用預(yù)定義的插入與提取運算符對文件流進行讀寫操作10.5 10.5 使用類成員函數(shù)對文件流進行操作使用類成員函數(shù)對文件流進行操作10.6 10.6 texttext文件與文件與binarybinary文件文件10.7 10.7 對數(shù)據(jù)文件進行隨機
2、訪問對數(shù)據(jù)文件進行隨機訪問210.1 10.1 流、文件以及流、文件以及c+c+的基本流類和文件流類系統(tǒng)的基本流類和文件流類系統(tǒng)- - 參看書參看書p232-234, 10.2p232-234, 10.2與與10.310.3節(jié)節(jié) c+ c+語言中的輸入輸出操作語言中的輸入輸出操作( (功能功能) )是由它所預(yù)是由它所預(yù)定義的諸定義的諸i/oi/o流類的一個類庫所提供的。流類的一個類庫所提供的。 1. 1. 流流( (stream)stream) 流流( (stream)stream)是一個邏輯概念是一個邏輯概念,它是,它是c+c+語言對語言對所有外部設(shè)備的邏輯抽象,它所有外部設(shè)備的邏輯抽象,它
3、代表的是某種流類類代表的是某種流類類型的一個對象型的一個對象。c+c+的的ioio系統(tǒng)將每個外部設(shè)備都轉(zhuǎn)系統(tǒng)將每個外部設(shè)備都轉(zhuǎn)換成一個稱為流的邏輯設(shè)備,由流來完成對不同設(shè)換成一個稱為流的邏輯設(shè)備,由流來完成對不同設(shè)備的具體操作。備的具體操作。3 2. 2. 文件文件( (file)file) 文件文件( (file)file)是一個物理概念是一個物理概念,代表存儲著信息集合的某,代表存儲著信息集合的某個個外部介質(zhì)外部介質(zhì),它是,它是c+c+語言語言對具體設(shè)備的抽象對具體設(shè)備的抽象。如,磁盤文。如,磁盤文件,顯示器,鍵盤。件,顯示器,鍵盤。 所有流所有流( (類對象類對象) )的行為都是相同的,
4、而不同的文件則可的行為都是相同的,而不同的文件則可能具有不同的行為。如,磁盤文件可進行寫也可進行讀操作;能具有不同的行為。如,磁盤文件可進行寫也可進行讀操作;顯示器文件則只可進行寫操作;而鍵盤文件只可進行讀操作。顯示器文件則只可進行寫操作;而鍵盤文件只可進行讀操作。 當(dāng)程序與一個文件交換信息時,必須通過當(dāng)程序與一個文件交換信息時,必須通過“打開文件打開文件”的操作將一個文件與一個流的操作將一個文件與一個流( (類對象類對象) )聯(lián)系起來。一旦建立了聯(lián)系起來。一旦建立了這種聯(lián)系,以后對該流這種聯(lián)系,以后對該流( (類對象類對象) )的訪問就是對該文件的訪問,的訪問就是對該文件的訪問,也就是對一個
5、具體設(shè)備的訪問??赏ㄟ^也就是對一個具體設(shè)備的訪問??赏ㄟ^“關(guān)閉文件關(guān)閉文件”的操作的操作將一個文件與流將一個文件與流( (類對象類對象) )的聯(lián)系斷開。的聯(lián)系斷開。4 3. 3. c+c+的基本流類系統(tǒng)的基本流類系統(tǒng) 在頭文件在頭文件 “ “iostreamiostream.h” .h” 中說明中說明( (預(yù)定義預(yù)定義) )了一批了一批基基本流類本流類: : iosios - - 基本流類的基類基本流類的基類; ; istreamistream - - 由由iosios派生,支持輸入派生,支持輸入( (提取提取“”)“”)操操作;作; ostreamostream - - 由由iosios派生
6、,支持輸出派生,支持輸出( (插入插入“”)“”)操操作;作; iostreamiostream - - 由由istreamistream與與ostreamostream共同派生,支持輸共同派生,支持輸入和輸出雙向操作。入和輸出雙向操作。 5 c+ c+預(yù)定義的流預(yù)定義的流有:有: extern extern istream istream cincin; - ; - 對象對象cincin對應(yīng)于對應(yīng)于鍵盤鍵盤文件文件 extern extern ostream ostream coutcout; - ; - 對象對象coutcout對應(yīng)于對應(yīng)于顯示器顯示器文件文件 extern extern
7、ostream ostream cerrcerr; - ; - 對象對象cerrcerr對應(yīng)于對應(yīng)于顯示器顯示器文件文件 extern extern ostreamostream clogclog; - ; - 對象對象clogclog對應(yīng)于對應(yīng)于顯示器顯示器文件文件 程序中可直接對上述程序中可直接對上述4 4個預(yù)定義流類對象進行讀寫,而不個預(yù)定義流類對象進行讀寫,而不必先進行必先進行“打開文件打開文件”的操作,使用完后也不需要進行的操作,使用完后也不需要進行“關(guān)關(guān)閉文件閉文件”的操作(因為這些流類對象與文件之間的聯(lián)系是預(yù)的操作(因為這些流類對象與文件之間的聯(lián)系是預(yù)定義好的,可認為系統(tǒng)已為每一
8、程序都隱含進行了對它們的定義好的,可認為系統(tǒng)已為每一程序都隱含進行了對它們的打開與關(guān)閉操作)。打開與關(guān)閉操作)。 6 4. c+ 4. c+的文件流類系統(tǒng)的文件流類系統(tǒng) 在頭文件在頭文件“fstreamfstream.h”.h”中說明中說明( (預(yù)定義預(yù)定義) )了一批了一批文件流文件流類類,專用于,專用于磁盤文件磁盤文件: : ifstreamifstream - - 由由istreamistream派生,支持從磁盤文件中輸入派生,支持從磁盤文件中輸入( (讀入讀入) )數(shù)據(jù);數(shù)據(jù); ofstreamofstream - - 由由ostreamostream派生,支持往磁盤文件中輸出派生,支
9、持往磁盤文件中輸出( (寫出寫出) )數(shù)據(jù);數(shù)據(jù); fstreamfstream - - 由由iostreamiostream派生,支持對磁盤文件進行派生,支持對磁盤文件進行輸入和輸出數(shù)據(jù)的雙向操作。輸入和輸出數(shù)據(jù)的雙向操作。 c+c+中沒有預(yù)定義的文件流中沒有預(yù)定義的文件流( (類對象類對象) ),程序中用到的所,程序中用到的所有文件流類對象都要進行自定義。有文件流類對象都要進行自定義。7* *10.2 10.2 插入與提取運算符的重載插入與提取運算符的重載 - - 參看書參看書p231, 10.1p231, 10.1節(jié)后半節(jié)后半對自定義類對自定義類complexcomplex重載輸入輸出運
10、算符重載輸入輸出運算符“”“”“”:#includeclass complex double r; double i;public:complex(double r0=0, double i0=0) r=r0; i=i0; complex operator +(complex c2); complex operator *(complex c2); friend istream& operator (istream& in, complex& com); friend ostream& operator ”operator”用于完成從用于完成從istreamistream類的流類對象類的流類對
11、象inin上(如對上(如對應(yīng)實參可為應(yīng)實參可為cincin,即指定從鍵盤上)輸入一個復(fù)數(shù)的有關(guān)數(shù)據(jù)放入即指定從鍵盤上)輸入一個復(fù)數(shù)的有關(guān)數(shù)據(jù)放入complexcomplex型引用對象型引用對象comcom中;而中;而“operator”operator”則用于實現(xiàn)往則用于實現(xiàn)往ostreamostream類的流類對象類的流類對象outout上(如對應(yīng)實參可為上(如對應(yīng)實參可為coutcout,即指定往屏幕上)輸出即指定往屏幕上)輸出complexcomplex類對象類對象comcom的的有關(guān)數(shù)據(jù)。有關(guān)數(shù)據(jù)。 3.3. 本程序重載的輸入輸出運算符的返回類型均為引用,為的是可使用本程序重載的輸入輸
12、出運算符的返回類型均為引用,為的是可使用返回結(jié)果繼續(xù)作左值,也即使返回結(jié)果能起到一個獨立對象(變量)的作返回結(jié)果繼續(xù)作左值,也即使返回結(jié)果能起到一個獨立對象(變量)的作用,從而可使用像用,從而可使用像“coutcoutc1c2;”c1c1c2;”c1c2;”這樣的調(diào)用語這樣的調(diào)用語句。另外,句。另外,“operator ”operator ”的第二形參的第二形參comcom也必須被說明成引用也必須被說明成引用“complex& com”complex& com”,目的則是要將輸入數(shù)據(jù)直接賦值給對應(yīng)實參變量(所目的則是要將輸入數(shù)據(jù)直接賦值給對應(yīng)實參變量(所擁有的存儲空間中)。擁有的存儲空間中)。
13、9 complex complex:operator +(complex c2) complex c;c.r=r+c2.r;c.i=i+c2.i;return c; complex complex:operator * (complex c2) complex temp;temp.r=(r*c2.r)-(i*c2.i);temp.i=(r*c2.i)+(i*c2.r);return temp;10istream& operator (istream& in, complex& com) incom.rcom.i;return in; /不可缺少,因為函數(shù)返回類型為不可缺少,因為函數(shù)返回類型為“
14、istream&” ostream& operator (ostream& out, complex com) out(com.r, com.i)endl;return out; /不可缺少,因為函數(shù)返回類型為不可缺少,因為函數(shù)返回類型為“ostream&”void main() complex c1(1,1), c2(2,3), c3, res;coutc1=c1c2=c2;res = c1+c2;coutc1+c2=res;coutc1*c2=c1*c2;11 coutc3; coutc3+c3=c3+c3; /* 注意輸入輸出語句中出現(xiàn)的注意輸入輸出語句中出現(xiàn)的類對象類對象cout以及以
15、及cin正是正是輸輸入輸出重載函數(shù)中入輸出重載函數(shù)中引用型形參引用型形參out以及以及in的對應(yīng)實參的對應(yīng)實參。即是說,。即是說,若使用若使用“coutc1;”它將等同于它將等同于“operatorc3;”則等同于使用則等同于使用“operator(cin, c3);”。 */ 程序執(zhí)行后,屏幕顯示結(jié)果為:程序執(zhí)行后,屏幕顯示結(jié)果為: c1=(1, 1)c2=(2, 3)c1+c2=(3, 4)c1*c2=(-1, 5)input c3:3 -5c3+c3=(6, -10)1210.3 10.3 對輸入輸出格式進行控制對輸入輸出格式進行控制10.3.1 10.3.1 格式控制函數(shù)及格式控制符格
16、式控制函數(shù)及格式控制符 10.3.2 10.3.2 輸入輸出格式控制示例輸入輸出格式控制示例 1310.3.1 10.3.1 格式控制函數(shù)及格式控制符格式控制函數(shù)及格式控制符 - - 參看書參看書p234, 10.4p234, 10.4節(jié)節(jié) 1. 1. iosios類中常用的公有格式控制成員函數(shù)類中常用的公有格式控制成員函數(shù) 在在iosios類中定義了一批公有的類中定義了一批公有的格式控制標(biāo)志位格式控制標(biāo)志位以及一些以及一些成員函數(shù),通常先用某些成員函數(shù)來設(shè)置標(biāo)志位,然后再使成員函數(shù),通常先用某些成員函數(shù)來設(shè)置標(biāo)志位,然后再使用另一些成員函數(shù)來進行格式輸出。另外,用另一些成員函數(shù)來進行格式輸出
17、。另外,iosios類中還設(shè)置了類中還設(shè)置了一個一個longlong型的數(shù)據(jù)成員用來記錄當(dāng)前被設(shè)置的格式狀態(tài),該型的數(shù)據(jù)成員用來記錄當(dāng)前被設(shè)置的格式狀態(tài),該數(shù)據(jù)成員被稱為數(shù)據(jù)成員被稱為格式控制標(biāo)志字格式控制標(biāo)志字( (或標(biāo)志狀態(tài)字或標(biāo)志狀態(tài)字) )。標(biāo)志字是。標(biāo)志字是由格式控制標(biāo)志位來由格式控制標(biāo)志位來“合成合成”的。的。 注意,注意,iosios類作為諸多類作為諸多i/oi/o流類的基類,其公有成員函數(shù)流類的基類,其公有成員函數(shù)當(dāng)然可被各派生類的對象所直接調(diào)用。當(dāng)然可被各派生類的對象所直接調(diào)用。14 (1) (1) iosios:flags:flags a.a. 格式一格式一: : long
18、 flags( long long flags( long lflagslflags ); ); 通過參數(shù)通過參數(shù)lflagslflags來重新設(shè)置來重新設(shè)置標(biāo)志字標(biāo)志字。 表示各表示各標(biāo)志位標(biāo)志位的枚舉常量有的枚舉常量有( (參看參看p235)p235):iosios:skipwsskipwsiosios:left :left iosios:right :right .iosios:stdiostdio 每一枚舉常量值都代表著格式控制標(biāo)志字中的某一個二每一枚舉常量值都代表著格式控制標(biāo)志字中的某一個二進制位進制位( (bit)bit),當(dāng)設(shè)置了某個標(biāo)志位屬性時,該位將取值當(dāng)設(shè)置了某個標(biāo)志位屬性
19、時,該位將取值“1”“1”,否則該位取值,否則該位取值“0”“0”。 15 另外注意,通過另外注意,通過使用位運算符使用位運算符“|”“|”可將多個格式控制可將多個格式控制標(biāo)志位屬性進行標(biāo)志位屬性進行“合成合成”。但從使用角度看,。但從使用角度看,所設(shè)置的標(biāo)所設(shè)置的標(biāo)志位屬性不能產(chǎn)生互斥志位屬性不能產(chǎn)生互斥。例如,格式控制標(biāo)志字中設(shè)立了。例如,格式控制標(biāo)志字中設(shè)立了三個平行的標(biāo)志位三個平行的標(biāo)志位( (iosios:decdec、iosios:octoct和和iosios:hex):hex)用于用于表示數(shù)制,程序員應(yīng)保障任何時刻只設(shè)置其中的某一個標(biāo)表示數(shù)制,程序員應(yīng)保障任何時刻只設(shè)置其中的某一
20、個標(biāo)志位。還有表示對齊標(biāo)志位的志位。還有表示對齊標(biāo)志位的iosios:left:left、iosios:right:right和和i o si o s : : i n t e r n a l: : i n t e r n a l , 以 及 表 示 實 數(shù) 格 式 標(biāo) 志 位 的以 及 表 示 實 數(shù) 格 式 標(biāo) 志 位 的iosios:scientific:scientific和和iosios:fixed:fixed,這些互斥屬性也不能同時這些互斥屬性也不能同時設(shè)置。設(shè)置。 b.b. 格式二格式二: : long flags(); long flags(); 返回當(dāng)前的標(biāo)志字。返回當(dāng)前的標(biāo)志
21、字。 16 (2) (2) iosios:setfsetf a.a. 格式一格式一: : long long setfsetf( long ( long lflagslflags ); ); 通過參數(shù)通過參數(shù)lflagslflags來設(shè)置指定的格式控制標(biāo)志位。來設(shè)置指定的格式控制標(biāo)志位。 注意,與注意,與flagsflags函數(shù)的函數(shù)的“替換替換”方式不同,此處為方式不同,此處為“添加添加”方式,即是說,它并不更改其它方式,即是說,它并不更改其它lflagslflags不涉及到的那些標(biāo)不涉及到的那些標(biāo)志位的當(dāng)前值。志位的當(dāng)前值。 b.b. 格式二格式二: : long long setfset
22、f( long ( long lflagslflags, long , long lmasklmask ); ); 設(shè)置指定的格式控制標(biāo)志位的值(首先將第二參數(shù)設(shè)置指定的格式控制標(biāo)志位的值(首先將第二參數(shù)lmasklmask所指定的那些位清零,而后用第一參數(shù)所指定的那些位清零,而后用第一參數(shù)lflagslflags所給定的值來所給定的值來重置這些標(biāo)志位)。重置這些標(biāo)志位)。 17 例如,為保障所設(shè)置的數(shù)制標(biāo)志位不產(chǎn)生互斥,當(dāng)要設(shè)例如,為保障所設(shè)置的數(shù)制標(biāo)志位不產(chǎn)生互斥,當(dāng)要設(shè)置置16進制時使用:進制時使用: setf(ios:hex, ios:basefield); 其中的其中的ios:bas
23、efield為一個在為一個在ios類中定義的公有靜態(tài)常類中定義的公有靜態(tài)常量,它的取值為量,它的取值為ios:dec|ios:oct|ios:hex。 同理,當(dāng)要設(shè)置對齊標(biāo)志位為同理,當(dāng)要設(shè)置對齊標(biāo)志位為ios:right以及實數(shù)格式標(biāo)以及實數(shù)格式標(biāo)志位為志位為ios:fixed,要使用:要使用: setf(ios:right, ios:adjustfield); setf(ios:fixed, ios:floatfield); 其中用到了公有靜態(tài)常量其中用到了公有靜態(tài)常量ios:adjustfield和和ios:floatfield。 ios:adjustfield的取值為的取值為ios:l
24、eft|ios:right|ios:internal,而而ios:floatfield的取值為的取值為ios:scientific|ios:fixed。 18 (3) (3) iosios:unsetfunsetf long long unsetfunsetf( long ( long lflagslflags ); ); 通過參數(shù)通過參數(shù)lflagslflags來清除指定的格式控制標(biāo)志位。來清除指定的格式控制標(biāo)志位。 (4) (4) iosios:fill:fill char fill( char char fill( char cfillcfill ); ); 將將“填充字符填充字符”設(shè)置
25、為設(shè)置為cfillcfill, , 并返回原并返回原“填充字填充字符符”。 19(5) (5) iosios:precision:precision intint precision( precision( int npint np ); ); 設(shè)置浮點數(shù)精度為設(shè)置浮點數(shù)精度為npnp并返回原精度。當(dāng)格式為并返回原精度。當(dāng)格式為iosios:scientific:scientific或或iosios:fixed:fixed時,精度時,精度npnp指小數(shù)點后的位指小數(shù)點后的位數(shù),否則指有效數(shù)字。數(shù),否則指有效數(shù)字。 (6) (6) iosios:width:width intint width(
26、 width( int nwint nw ); ); 設(shè)置當(dāng)前被顯示數(shù)據(jù)的域?qū)捲O(shè)置當(dāng)前被顯示數(shù)據(jù)的域?qū)抧wnw并返回原域?qū)?。默認值并返回原域?qū)?。默認值為為0 0,將按實際需要的域?qū)掃M行輸出。此設(shè)置只對隨后的一,將按實際需要的域?qū)掃M行輸出。此設(shè)置只對隨后的一個數(shù)據(jù)有效,而后系統(tǒng)立刻恢復(fù)域?qū)挒橄到y(tǒng)默認值個數(shù)據(jù)有效,而后系統(tǒng)立刻恢復(fù)域?qū)挒橄到y(tǒng)默認值0 0。20 2. 2. 常用的輸入輸出格式控制符常用的輸入輸出格式控制符 可直接用于提取和插入算符可直接用于提取和插入算符(“”(“”和和“”)“”)之后,而之后,而不像格式控制成員函數(shù)那樣必須被單獨調(diào)用。不像格式控制成員函數(shù)那樣必須被單獨調(diào)用。 (1)
27、 (1) iostreamiostream.h.h中含有的無參格式控制符中含有的無參格式控制符( (參看參看p237)p237): . . endlendl. ends. ends. flush. flush. . wsws. . decdec. hex. hex. . octoct21 (2) (2) iomanipiomanip.h.h中含有的有參格式控制符中含有的有參格式控制符( (參看參看p237)p237): . . setbasesetbase( ( intint base ) base ). . resetiosflagsresetiosflags( long ( long lf
28、lagslflags ) ). . setiosflagssetiosflags( long ( long lflagslflags ) ). . setfillsetfill( char ( char cfillcfill ) ). . setprecisionsetprecision( ( int npint np ) ). . setwsetw( ( int nwint nw ) )22 10.3.2 10.3.2 輸入輸出格式控制示例輸入輸出格式控制示例 1. 格式控制示例一格式控制示例一 ( flags和和setf等函數(shù)的功能等函數(shù)的功能) #include void main()
29、coutios basefield; /輸出:輸出:112 cout (ios:dec|ios:oct|ios:hex)endl; /輸出:輸出:112 coutios:adjustfield; /輸出:輸出:14 cout (ios:left|ios:right|ios:internal)endl; /輸出:輸出:14 coutios:floatfield; /輸出:輸出:6144 cout (ios:scientific|ios:fixed)endl; /輸出:輸出:614423/flags將重新設(shè)置標(biāo)志字,將重新設(shè)置標(biāo)志字,“替換替換”方式方式 cout.flags(ios:showba
30、se); coutcout.flags()endl; /輸出:輸出:128 cout.flags(ios:showpoint); coutcout.flags()endl; /輸出:輸出:256 cout.unsetf(ios:showpoint); coutcout.flags()endl; /輸出:輸出:0 /setf為為“添加添加”方式方式 cout.setf(ios:showbase); coutcout.flags()endl; /輸出:輸出:128 cout.setf(ios:showpoint); coutcout.flags()endl; /輸出:輸出:384 cout.uns
31、etf(ios:showpoint); coutcout.flags()endl; /輸出:輸出:128 242. 格式控制示例二格式控制示例二 對輸出數(shù)據(jù)的寬度、精度等方面進行設(shè)置與使用。對輸出數(shù)據(jù)的寬度、精度等方面進行設(shè)置與使用。#include void main() cout.width(6); /只管隨后一個數(shù)的域?qū)捴还茈S后一個數(shù)的域?qū)?cout478527.4272endl; / 478527.4272coutsetw(6)4785setw(8)27.4272endlendl; / 4785 27.4272cout.width(6);cout.precision(3); /當(dāng)格式為
32、當(dāng)格式為ios:scientific或或ios:fixed時,浮點數(shù)精度時,浮點數(shù)精度 /np指小數(shù)點后的位數(shù),否則指有效數(shù)字指小數(shù)點后的位數(shù),否則指有效數(shù)字 /此時設(shè)置浮點數(shù)的有效數(shù)字為此時設(shè)置浮點數(shù)的有效數(shù)字為3cout4785setw(8)27.4272endl; / 4785 27.4 25coutsetw(6)4785setw(8)setprecision(2)27.4272endlendl; / 4785 27 /“setprecision(2)”設(shè)置浮點數(shù)的有效數(shù)字設(shè)置浮點數(shù)的有效數(shù)字cout.setf(ios:fixed, ios:floatfield); /今后以定點格式顯示
33、浮點數(shù)今后以定點格式顯示浮點數(shù)(無指數(shù)部分無指數(shù)部分)cout.width(6); cout.precision(3); /當(dāng)格式為當(dāng)格式為ios:fixed時,設(shè)置小數(shù)點后的位數(shù)時,設(shè)置小數(shù)點后的位數(shù)cout4785setw(8)27.4272 = 讀寫操作讀寫操作 = = 關(guān)閉文件關(guān)閉文件。 27 “打開文件打開文件”通常通過構(gòu)造函數(shù)自動完成(也可顯式調(diào)通常通過構(gòu)造函數(shù)自動完成(也可顯式調(diào)用成員函數(shù)用成員函數(shù)openopen完成)。完成)?!瓣P(guān)閉文件關(guān)閉文件”通常通過使用通常通過使用“.close();”close();”來顯式完成。來顯式完成。 例例1: 1: ofstreamofstr
34、eam outfile1(myfile1.txt); outfile1(myfile1.txt); 創(chuàng)建創(chuàng)建ofstreamofstream類的對象類的對象outfile1outfile1;使流類對象使流類對象outfile1outfile1與與磁盤文件磁盤文件 myfile1.txtmyfile1.txt相聯(lián)系;并打開用于相聯(lián)系;并打開用于“寫寫”的磁盤的磁盤文件文件 myfile1.txtmyfile1.txt。 例例2: 2: ofstreamofstream outfile1; outfile1; / /創(chuàng)建創(chuàng)建ofstreamofstream類的對象類的對象outfile1outfi
35、le1 outfile1.open(myfile1.txt); outfile1.open(myfile1.txt); / /顯式調(diào)用成員函數(shù)顯式調(diào)用成員函數(shù)openopen來打開文件來打開文件28 二二. 與創(chuàng)建流類對象相關(guān)的三個構(gòu)造函數(shù)與創(chuàng)建流類對象相關(guān)的三個構(gòu)造函數(shù) 1. ifstream:ifstream ifstream( const char* szname, int nmode = ios:in, int nprot = filebuf:openprot ); 參數(shù)參數(shù): (1) szname - 文件名;文件名; (2) nmode - 打開文件的方式。打開文件的方式。 ios
36、:in - 以讀以讀(輸入輸入)為目的打開。為目的打開。 ios:nocreate - 僅打開一個已存在文件。僅打開一個已存在文件。 ios:binary - 打開二進制文件。打開二進制文件。 (3) nprot - 指定所打開文件的保護方式。指定所打開文件的保護方式。29 2. ofstream:ofstream ofstream( const char* szname, int nmode = ios:out, int nprot = filebuf:openprot ); 參數(shù)參數(shù): (1) szname - 文件名;文件名; (2) nmode - 打開文件的方式。打開文件的方式。 i
37、os:out - 以寫以寫(輸出輸出)為目的打開文件。為目的打開文件。 ios:trunc - 若文件存在,則將文件長度截為若文件存在,則將文件長度截為0。 ios:binary - 打開二進制文件。打開二進制文件。 ios:app - 以追加方式打開。以追加方式打開。 . (3) nprot - 指定所打開文件的保護方式。指定所打開文件的保護方式。 30 3. fstream:fstream fstream( const char* szname, int nmode, int nprot = filebuf:openprot ); 參數(shù)含義和用法與參數(shù)含義和用法與ofstream構(gòu)造函數(shù)處
38、相同。構(gòu)造函數(shù)處相同。 三三. 與創(chuàng)建流類對象相關(guān)的三個與創(chuàng)建流類對象相關(guān)的三個open函數(shù)函數(shù) 1. ofstream:open void open( const char* szname, int nmode = ios:out, int nprot = filebuf:openprot ); 2. ifstream:open void open( const char* szname, int nmode = ios:in, int nprot = filebuf:openprot ); 3. fstream:open void open( const char* szname, int
39、 nmode, int nprot = filebuf:openprot ); 3110.4.2 讀寫操作示例讀寫操作示例 - - 參看書參看書p246, 10.6.2p246, 10.6.2小節(jié)的小節(jié)的1 1 對文件的對文件的“讀寫操作讀寫操作”通常使用預(yù)定義的通常使用預(yù)定義的類成員函數(shù)類成員函數(shù)來實現(xiàn)(隨后介紹),但也可使用繼承而來的來實現(xiàn)(隨后介紹),但也可使用繼承而來的插入和提取運插入和提取運算符算符“”“”和和“”“”operator ”,所以,所以,ifstreamifstream流(類對象)可以使用預(yù)定義的算符流(類對象)可以使用預(yù)定義的算符“”“”來對自來對自定義磁盤文件進行定
40、義磁盤文件進行“讀讀”操作(允許通過派生類對象直接調(diào)操作(允許通過派生類對象直接調(diào)用其基類的公有成員函數(shù));用其基類的公有成員函數(shù)); ofstreamofstream類由類由ostreamostream類所派生類所派生,而,而ostreamostream類中預(yù)定義類中預(yù)定義了公有的運算符了公有的運算符重載函數(shù)重載函數(shù)“operator ”operator ”,所以,所以,ofstreamofstream流(類對象)可以使用預(yù)定義的算符流(類對象)可以使用預(yù)定義的算符“”“”“”和和“”“”來對自定義磁盤文件進行來對自定義磁盤文件進行“讀讀” ” 與與“寫寫”操作。操作。 還有一點需要注意:使
41、用預(yù)定義的算符還有一點需要注意:使用預(yù)定義的算符“”“”“”來進行來進行“讀讀”操作操作時遇空格或換行均結(jié)束一個數(shù)據(jù)相呼應(yīng)。時遇空格或換行均結(jié)束一個數(shù)據(jù)相呼應(yīng)。 下述下述示例程序示例程序做了如下的做了如下的3 3件事:件事:1)1) 往文件寫數(shù)據(jù);往文件寫數(shù)據(jù);2)2) 往文件尾部追加數(shù)據(jù);往文件尾部追加數(shù)據(jù); 3)3) 從文件讀出數(shù)據(jù)并顯示在屏幕上。從文件讀出數(shù)據(jù)并顯示在屏幕上。 33#include void main() /1) 往文件寫數(shù)據(jù)往文件寫數(shù)據(jù)ofstream outfile1(myfile1.txt); /以以“寫寫”方式打開方式打開outfile1hello!.china!
42、 nankai_universityendl; outfile1.close(); /2) 往文件尾部追加數(shù)據(jù)往文件尾部追加數(shù)據(jù) outfile1.open(myfile1.txt, ios:app); /以以“追加追加”方式打開方式打開int x=1212, y=6868;outfile1x ystr1str2; /使用使用“”讀讀(遇空格、換行均結(jié)束遇空格、換行均結(jié)束)infile1x2y2;infile1.close(); 34coutstr1=str1endl;coutstr2=str2endl;coutx2=x2endl;couty2=y2endl; 程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)
43、行后的顯示結(jié)果如下:str1=hello!.china!str2=nankai_universityx2=1212y2=686835 10.5 10.5 使用類成員函數(shù)對文件流進行操作使用類成員函數(shù)對文件流進行操作10.5.1 10.5.1 類成員函數(shù)類成員函數(shù)getget與與putput10.5.2 10.5.2 類成員函數(shù)類成員函數(shù)readread與與writewrite10.5.3 10.5.3 類成員函數(shù)類成員函數(shù)getlinegetline 3610.5.1 10.5.1 類成員函數(shù)類成員函數(shù)getget與與putput- - 參看書參看書p247, 10.6.2p247, 10.6
44、.2小節(jié)的小節(jié)的2 2 ostreamostream& put( char & put( char chch ); );功能:將字符功能:將字符chch寫到自定義文件中。寫到自定義文件中。 istreamistream& get( char& & get( char& rchrch ); );功能:從自定義文件中讀出功能:從自定義文件中讀出1 1個字符放入引用個字符放入引用rchrch中。中。 注意,注意,putput實際上只是實際上只是ostreamostream類中定義的公有成員類中定義的公有成員函數(shù),當(dāng)然通過其派生類函數(shù),當(dāng)然通過其派生類ofstreamofstream的類對象也可以直接
45、的類對象也可以直接對它進行調(diào)用。同理,通過對它進行調(diào)用。同理,通過ifstreamifstream的類對象可以直接的類對象可以直接調(diào)用調(diào)用getget。37 1. 程序示例一程序示例一 從鍵盤輸入任一個字符串,通過從鍵盤輸入任一個字符串,通過put將其寫到自定義磁盤文件將其寫到自定義磁盤文件“putgetfile.txt”中,而后再使用中,而后再使用get從該文件中讀出所寫串并顯示在屏幕上。從該文件中讀出所寫串并顯示在屏幕上。 #include #include void main() /鍵盤輸入字符串,通過鍵盤輸入字符串,通過put將其寫到自定義磁盤文件中將其寫到自定義磁盤文件中char s
46、tr80;coutinput string:endl;gets(str);ofstream fout(putgetfile.txt); int i=0;while ( stri ) fout.put(stri+); fout.close();cout-endl;38 /而后使用而后使用get從文件中讀出該串顯示在屏幕上從文件中讀出該串顯示在屏幕上char ch;ifstream fin(putgetfile.txt); fin.get(ch);while(!fin.eof() /從頭讀到文件結(jié)束從頭讀到文件結(jié)束(當(dāng)前符號非文件結(jié)束符時繼續(xù)當(dāng)前符號非文件結(jié)束符時繼續(xù)) /注注: 成員函數(shù)成員函數(shù)
47、eof()在讀到文件結(jié)束時方返回在讀到文件結(jié)束時方返回true coutch; fin.get(ch);coutendl;fin.close(); 程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)行后的顯示結(jié)果如下:input string:file operating - using put and get, ok! 12345-file operating - using put and get, ok! 1234539 2. 程序示例二程序示例二 - 對指定文件進行拷貝對指定文件進行拷貝 使用類成員函數(shù)使用類成員函數(shù)get與與put對指定文件進行拷貝。被拷貝對指定文件進行拷貝。被拷貝的的“源文件源文件”
48、以及拷貝到的以及拷貝到的“目的文件目的文件”的名字與路徑均由的名字與路徑均由命令行參數(shù)來提供。命令行參數(shù)來提供。 程序執(zhí)行結(jié)果程序執(zhí)行結(jié)果(若提供的命令行參數(shù)為若提供的命令行參數(shù)為:mycopy.cpp res_1.cpp): copy file from mycopy.cpp to res_1.cpp 程序執(zhí)行結(jié)果程序執(zhí)行結(jié)果(若提供的命令行參數(shù)個數(shù)不對時若提供的命令行參數(shù)個數(shù)不對時):error ! - supplying 2 command-line argements ?!40 #include #include void main(int argc, char* argv) if(a
49、rgc!=3) /命令行參數(shù)個數(shù)不對時命令行參數(shù)個數(shù)不對時 couterror ! - supplying 2 command-line argements ?!endl; exit (1); coutcopy file from argv1 to argv2endl; ifstream fin(argv1); /命令行參數(shù)命令行參數(shù)1作為文件名作為文件名 ofstream fout(argv2); /命令行參數(shù)命令行參數(shù)2作為文件名作為文件名 char ch; fin.get(ch); while(!fin.eof() /從頭讀到文件結(jié)束從頭讀到文件結(jié)束 fout.put(ch); fin.
50、get(ch); fin.close(); fout.close(); 4110.5.2 10.5.2 類成員函數(shù)類成員函數(shù)readread與與write write - - 參看書參看書p247, 10.6.2p247, 10.6.2小節(jié)的小節(jié)的2 2 通常使用通常使用read與與write對二進制文件對二進制文件(binary file)進行讀寫。進行讀寫。 ostream& write( const char* pch, int ncount ); 功能:將功能:將pch緩沖區(qū)中的前緩沖區(qū)中的前ncount個字符寫出到某個文件中。個字符寫出到某個文件中。istream& read( ch
51、ar* pch, int ncount ); 功能:從某個文件中讀入功能:從某個文件中讀入ncount個字符放入個字符放入pch緩沖區(qū)中緩沖區(qū)中(若讀至文件結(jié)束尚不足(若讀至文件結(jié)束尚不足ncount個字符時,也將立即結(jié)束個字符時,也將立即結(jié)束本次讀取過程)。本次讀取過程)。 注意:使用注意:使用write與與read進行數(shù)據(jù)讀寫時,不必要在數(shù)據(jù)進行數(shù)據(jù)讀寫時,不必要在數(shù)據(jù)間再額外間再額外“插入插入”分割符,這是因為它們都要求提供第二分割符,這是因為它們都要求提供第二實參來指定讀寫長度。實參來指定讀寫長度。42 以下的示例程序先使用以下的示例程序先使用write往自定義二進制磁盤文件往自定義二
52、進制磁盤文件中寫出如下中寫出如下3個個“值值”:字符串:字符串str的長度值的長度值len(一個正整一個正整數(shù)數(shù))、字符串、字符串str本身、以及一個結(jié)構(gòu)體的數(shù)據(jù),而后再使用本身、以及一個結(jié)構(gòu)體的數(shù)據(jù),而后再使用read讀出這些讀出這些“值值”并將它們顯示在屏幕上并將它們顯示在屏幕上。 #include #include void main() char str20=hello world!;struct stuchar name20;int age;double score; ss=wu jun, 22, 91.5; 43 coutwrite to wrt_read_file.binendl
53、;ofstream fout(wrt_read_file.bin, ios:binary); /打開用于打開用于“寫寫”的二進制磁盤文件的二進制磁盤文件int len=strlen(str);fout.write( (char*)(&len), sizeof(int) ); fout.write(str, len); /數(shù)據(jù)間無需分割符數(shù)據(jù)間無需分割符fout.write(char*)(&ss), sizeof(ss); fout.close();cout-endl;cout- read it from wrt_read_file.bin -endl;char str280;ifstream
54、fin(wrt_read_file.bin, ios:binary); fin.read( (char*)(&len), sizeof(int) );fin.read(str2, len);str2len=0; 44 fin.read( (char*)(&ss), sizeof(ss) ); coutlen=lenendl; coutstr2=str2endl; ,ss.age,ss.scoreendl; fin.close(); cout-wu jun,22,91.5-45 最常用格式為:最常用格式為:istream& getline( char* pch, int n
55、count, char delim = n ); 功能:從某個文件中讀出一行功能:從某個文件中讀出一行(至多至多ncount個字符個字符)放入放入pch緩沖區(qū)中,缺省行結(jié)束符為緩沖區(qū)中,缺省行結(jié)束符為n。 程序?qū)嵗绦驅(qū)嵗? 讀出讀出“getline_1.cpp”的各行并顯示在屏幕上(如,可的各行并顯示在屏幕上(如,可將本源程序存放在將本源程序存放在“getline_1.cpp“文件中)。文件中)。 10.5.3 10.5.3 類成員函數(shù)類成員函數(shù)getline getline - - 注,書中沒介紹該函數(shù)注,書中沒介紹該函數(shù) 46 #include void main() char line
56、81; ifstream infile(“getline_1.cpp”); /打開文件用于讀打開文件用于讀 infile.getline(line, 80); /讀出一行讀出一行(至多至多80個字符個字符)放入放入line中中 while(!infile.eof() /尚未讀到文件結(jié)束則繼續(xù)循環(huán)尚未讀到文件結(jié)束則繼續(xù)循環(huán)(處理處理) coutlineendl; /顯示在屏幕上顯示在屏幕上 infile.getline(line,80); /再讀一行再讀一行 infile.close();47 10.6 text文件與文件與binary文件文件10.6.1 對對text文件與文件與binary文
57、件的一般使用示例文件的一般使用示例10.6.2 采用采用binary文件形式對結(jié)構(gòu)體數(shù)據(jù)文件形式對結(jié)構(gòu)體數(shù)據(jù)進行存儲與讀寫處理進行存儲與讀寫處理- 10.6.1 對對text文件與文件與binary文件的一般使用示例文件的一般使用示例 * 以以text形式存儲形式存儲,優(yōu)點優(yōu)點是具有較高的兼容性。是具有較高的兼容性。缺點缺點是是存儲一批純數(shù)值信息時,要在數(shù)據(jù)之間人為地添加分割符;存儲一批純數(shù)值信息時,要在數(shù)據(jù)之間人為地添加分割符;輸入輸出過程中,系統(tǒng)要對內(nèi)外存的數(shù)據(jù)格式進行相應(yīng)轉(zhuǎn)輸入輸出過程中,系統(tǒng)要對內(nèi)外存的數(shù)據(jù)格式進行相應(yīng)轉(zhuǎn)換;另外換;另外text文件不便于對數(shù)據(jù)實行隨機訪問。文件不便于對
58、數(shù)據(jù)實行隨機訪問。48 * * 以以binarybinary形式存儲形式存儲,優(yōu)點優(yōu)點是便于對數(shù)據(jù)實行隨機訪是便于對數(shù)據(jù)實行隨機訪問(每一同類型數(shù)據(jù)所占磁盤空間的大小均相同,不必在問(每一同類型數(shù)據(jù)所占磁盤空間的大小均相同,不必在數(shù)據(jù)之間人為地添加分割符);輸入輸出過程中,系統(tǒng)不數(shù)據(jù)之間人為地添加分割符);輸入輸出過程中,系統(tǒng)不對數(shù)據(jù)進行任何轉(zhuǎn)換。對數(shù)據(jù)進行任何轉(zhuǎn)換。缺點缺點是兼容性低。是兼容性低。 注:由程序員決定將數(shù)據(jù)存儲為注:由程序員決定將數(shù)據(jù)存儲為texttext文件或者文件或者binarybinary文文件兩種形式之一。件兩種形式之一。 缺省打開方式時,默認為缺省打開方式時,默認為t
59、exttext文件形式。若欲使用文件形式。若欲使用binarybinary文件形式,要將打開方式設(shè)為文件形式,要將打開方式設(shè)為“iosios:binary”:binary”。 通常將純文本信息(如字符串)以通常將純文本信息(如字符串)以texttext文件形式存儲,文件形式存儲,而將數(shù)值信息以而將數(shù)值信息以binarybinary文件形式存儲。文件形式存儲。 49 1. 1. 示例示例1 - 1 - 對兩種文件進行操作對兩種文件進行操作 將將a a數(shù)組中準(zhǔn)備好的數(shù)組中準(zhǔn)備好的8 8個個intint型數(shù)據(jù),分別通過算符型數(shù)據(jù),分別通過算符“”“”依次寫出到依次寫出到texttext文件文件ft.
60、txtft.txt之中(注意各數(shù)據(jù)在文件中之中(注意各數(shù)據(jù)在文件中“長短長短”不一,且數(shù)據(jù)間必須加入分割符)。而且還通過不一,且數(shù)據(jù)間必須加入分割符)。而且還通過使用類成員函數(shù)使用類成員函數(shù)writewrite將這相同的將這相同的8 8個個intint型數(shù)據(jù)依次寫出到型數(shù)據(jù)依次寫出到binarybinary文件文件fbfb.bin.bin之中(注意各數(shù)據(jù)在文件中之中(注意各數(shù)據(jù)在文件中“長短長短”相相同,且數(shù)據(jù)間不需要加入分割符)。同,且數(shù)據(jù)間不需要加入分割符)。 另外,程序中通過使用無參的成員函數(shù)另外,程序中通過使用無參的成員函數(shù)“tellptellp()”()”來來獲取當(dāng)前已寫出到各文件的
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年射頻消融治療儀項目合作計劃書
- 2025年P(guān)M步進電機合作協(xié)議書
- 含稅金額合同范本
- 動遷房的買賣合同范本
- 外籍工作人員聘請合同范本
- 綠化養(yǎng)護及道路保潔服務(wù)合同范本
- 關(guān)于英語合同范本
- 介紹公司合同范本
- 二包服務(wù)合同范本
- 臨時設(shè)施合同范本
- 管道工程預(yù)算
- 公路施工技術(shù)ppt課件(完整版)
- 通信原理英文版課件:Ch6 Passband Data Transmission
- GB∕T 41098-2021 起重機 安全 起重吊具
- 如何發(fā)揮好辦公室協(xié)調(diào)、督導(dǎo)、服務(wù)職能
- 部隊安全教育教案大全
- HY∕T 0289-2020 海水淡化濃鹽水排放要求
- 班組長管理能力提升培訓(xùn)(PPT96張)課件
- 法蘭蝶閥螺栓配用表
- 垃圾中轉(zhuǎn)站施工方案及施工方法
- 內(nèi)蒙古自治區(qū)小額貸款公司試點管理實施細則
評論
0/150
提交評論