第10章流類庫(kù)與輸入輸出
《第10章流類庫(kù)與輸入輸出》由會(huì)員分享,可在線閱讀,更多相關(guān)《第10章流類庫(kù)與輸入輸出(61頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、1第第1010章章 流類庫(kù)與輸入輸出流類庫(kù)與輸入輸出10.1 10.1 流、文件以及流、文件以及C+C+的基本流類和文件流類系統(tǒng)的基本流類和文件流類系統(tǒng)* *10.2 10.2 插入與提取運(yùn)算符的重載插入與提取運(yùn)算符的重載10.3 10.3 對(duì)輸入輸出格式進(jìn)行控制對(duì)輸入輸出格式進(jìn)行控制10.4 10.4 使用預(yù)定義的插入與提取運(yùn)算符對(duì)文件流進(jìn)行讀寫操作使用預(yù)定義的插入與提取運(yùn)算符對(duì)文件流進(jìn)行讀寫操作10.5 10.5 使用類成員函數(shù)對(duì)文件流進(jìn)行操作使用類成員函數(shù)對(duì)文件流進(jìn)行操作10.6 10.6 texttext文件與文件與binarybinary文件文件10.7 10.7 對(duì)數(shù)據(jù)文件進(jìn)行隨機(jī)
2、訪問對(duì)數(shù)據(jù)文件進(jìn)行隨機(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ǔ)言中的輸入輸出操作( (功能功能) )是由它所預(yù)是由它所預(yù)定義的諸定義的諸I/OI/O流類的一個(gè)類庫(kù)所提供的。流類的一個(gè)類庫(kù)所提供的。 1. 1. 流流( (Stream)Stream) 流流( (stream)stream)是一個(gè)邏輯概念是一個(gè)邏輯概念,它是,它是C+C+語(yǔ)言對(duì)語(yǔ)言對(duì)所有外部設(shè)備的邏輯抽象,它所有外部設(shè)備的邏輯抽象,它
3、代表的是某種流類類代表的是某種流類類型的一個(gè)對(duì)象型的一個(gè)對(duì)象。C+C+的的IOIO系統(tǒng)將每個(gè)外部設(shè)備都轉(zhuǎn)系統(tǒng)將每個(gè)外部設(shè)備都轉(zhuǎn)換成一個(gè)稱為流的邏輯設(shè)備,由流來(lái)完成對(duì)不同設(shè)換成一個(gè)稱為流的邏輯設(shè)備,由流來(lái)完成對(duì)不同設(shè)備的具體操作。備的具體操作。3 2. 2. 文件文件( (File)File) 文件文件( (File)File)是一個(gè)物理概念是一個(gè)物理概念,代表存儲(chǔ)著信息集合的某,代表存儲(chǔ)著信息集合的某個(gè)個(gè)外部介質(zhì)外部介質(zhì),它是,它是C+C+語(yǔ)言語(yǔ)言對(duì)具體設(shè)備的抽象對(duì)具體設(shè)備的抽象。如,磁盤文。如,磁盤文件,顯示器,鍵盤。件,顯示器,鍵盤。 所有流所有流( (類對(duì)象類對(duì)象) )的行為都是相同的,
4、而不同的文件則可的行為都是相同的,而不同的文件則可能具有不同的行為。如,磁盤文件可進(jìn)行寫也可進(jìn)行讀操作;能具有不同的行為。如,磁盤文件可進(jìn)行寫也可進(jìn)行讀操作;顯示器文件則只可進(jìn)行寫操作;而鍵盤文件只可進(jìn)行讀操作。顯示器文件則只可進(jìn)行寫操作;而鍵盤文件只可進(jìn)行讀操作。 當(dāng)程序與一個(gè)文件交換信息時(shí),必須通過當(dāng)程序與一個(gè)文件交換信息時(shí),必須通過“打開文件打開文件”的操作將一個(gè)文件與一個(gè)流的操作將一個(gè)文件與一個(gè)流( (類對(duì)象類對(duì)象) )聯(lián)系起來(lái)。一旦建立了聯(lián)系起來(lái)。一旦建立了這種聯(lián)系,以后對(duì)該流這種聯(lián)系,以后對(duì)該流( (類對(duì)象類對(duì)象) )的訪問就是對(duì)該文件的訪問,的訪問就是對(duì)該文件的訪問,也就是對(duì)一個(gè)
5、具體設(shè)備的訪問??赏ㄟ^也就是對(duì)一個(gè)具體設(shè)備的訪問??赏ㄟ^“關(guān)閉文件關(guān)閉文件”的操作的操作將一個(gè)文件與流將一個(gè)文件與流( (類對(duì)象類對(duì)象) )的聯(lián)系斷開。的聯(lián)系斷開。4 3. 3. C+C+的基本流類系統(tǒng)的基本流類系統(tǒng) 在頭文件在頭文件 “ “iostreamiostream.h” .h” 中說(shuō)明中說(shuō)明( (預(yù)定義預(yù)定義) )了一批了一批基基本流類本流類: : iosios - - 基本流類的基類基本流類的基類; ; istreamistream - - 由由iosios派生,支持輸入派生,支持輸入( (提取提取“”)“”)操操作;作; ostreamostream - - 由由iosios派生
6、,支持輸出派生,支持輸出( (插入插入“”)“”)操操作;作; iostreamiostream - - 由由istreamistream與與ostreamostream共同派生,支持輸共同派生,支持輸入和輸出雙向操作。入和輸出雙向操作。 5 C+ C+預(yù)定義的流預(yù)定義的流有:有: extern extern istream istream cincin; - ; - 對(duì)象對(duì)象cincin對(duì)應(yīng)于對(duì)應(yīng)于鍵盤鍵盤文件文件 extern extern ostream ostream coutcout; - ; - 對(duì)象對(duì)象coutcout對(duì)應(yīng)于對(duì)應(yīng)于顯示器顯示器文件文件 extern extern
7、ostream ostream cerrcerr; - ; - 對(duì)象對(duì)象cerrcerr對(duì)應(yīng)于對(duì)應(yīng)于顯示器顯示器文件文件 extern extern ostreamostream clogclog; - ; - 對(duì)象對(duì)象clogclog對(duì)應(yīng)于對(duì)應(yīng)于顯示器顯示器文件文件 程序中可直接對(duì)上述程序中可直接對(duì)上述4 4個(gè)預(yù)定義流類對(duì)象進(jìn)行讀寫,而不個(gè)預(yù)定義流類對(duì)象進(jìn)行讀寫,而不必先進(jìn)行必先進(jìn)行“打開文件打開文件”的操作,使用完后也不需要進(jìn)行的操作,使用完后也不需要進(jìn)行“關(guān)關(guān)閉文件閉文件”的操作(因?yàn)檫@些流類對(duì)象與文件之間的聯(lián)系是預(yù)的操作(因?yàn)檫@些流類對(duì)象與文件之間的聯(lián)系是預(yù)定義好的,可認(rèn)為系統(tǒng)已為每一
8、程序都隱含進(jìn)行了對(duì)它們的定義好的,可認(rèn)為系統(tǒng)已為每一程序都隱含進(jìn)行了對(duì)它們的打開與關(guān)閉操作)。打開與關(guān)閉操作)。 6 4. C+ 4. C+的文件流類系統(tǒng)的文件流類系統(tǒng) 在頭文件在頭文件“fstreamfstream.h”.h”中說(shuō)明中說(shuō)明( (預(yù)定義預(yù)定義) )了一批了一批文件流文件流類類,專用于,專用于磁盤文件磁盤文件: : ifstreamifstream - - 由由istreamistream派生,支持從磁盤文件中輸入派生,支持從磁盤文件中輸入( (讀入讀入) )數(shù)據(jù);數(shù)據(jù); ofstreamofstream - - 由由ostreamostream派生,支持往磁盤文件中輸出派生,支
9、持往磁盤文件中輸出( (寫出寫出) )數(shù)據(jù);數(shù)據(jù); fstreamfstream - - 由由iostreamiostream派生,支持對(duì)磁盤文件進(jìn)行派生,支持對(duì)磁盤文件進(jìn)行輸入和輸出數(shù)據(jù)的雙向操作。輸入和輸出數(shù)據(jù)的雙向操作。 C+C+中沒有預(yù)定義的文件流中沒有預(yù)定義的文件流( (類對(duì)象類對(duì)象) ),程序中用到的所,程序中用到的所有文件流類對(duì)象都要進(jìn)行自定義。有文件流類對(duì)象都要進(jìn)行自定義。7* *10.2 10.2 插入與提取運(yùn)算符的重載插入與提取運(yùn)算符的重載 - - 參看書參看書p231, 10.1p231, 10.1節(jié)后半節(jié)后半對(duì)自定義類對(duì)自定義類complexcomplex重載輸入輸出運(yùn)
10、算符重載輸入輸出運(yùn)算符“”“”“”:#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類的流類對(duì)象類的流類對(duì)
11、象inin上(如對(duì)上(如對(duì)應(yīng)實(shí)參可為應(yīng)實(shí)參可為cincin,即指定從鍵盤上)輸入一個(gè)復(fù)數(shù)的有關(guān)數(shù)據(jù)放入即指定從鍵盤上)輸入一個(gè)復(fù)數(shù)的有關(guān)數(shù)據(jù)放入complexcomplex型引用對(duì)象型引用對(duì)象comcom中;而中;而“operator”operator”則用于實(shí)現(xiàn)往則用于實(shí)現(xiàn)往ostreamostream類的流類對(duì)象類的流類對(duì)象outout上(如對(duì)應(yīng)實(shí)參可為上(如對(duì)應(yīng)實(shí)參可為coutcout,即指定往屏幕上)輸出即指定往屏幕上)輸出complexcomplex類對(duì)象類對(duì)象comcom的的有關(guān)數(shù)據(jù)。有關(guān)數(shù)據(jù)。 3.3. 本程序重載的輸入輸出運(yùn)算符的返回類型均為引用,為的是可使用本程序重載的輸入輸
12、出運(yùn)算符的返回類型均為引用,為的是可使用返回結(jié)果繼續(xù)作左值,也即使返回結(jié)果能起到一個(gè)獨(dú)立對(duì)象(變量)的作返回結(jié)果繼續(xù)作左值,也即使返回結(jié)果能起到一個(gè)獨(dú)立對(duì)象(變量)的作用,從而可使用像用,從而可使用像“coutcoutc1c2;”c1c1c2;”c1c2;”這樣的調(diào)用語(yǔ)這樣的調(diào)用語(yǔ)句。另外,句。另外,“operator ”operator ”的第二形參的第二形參comcom也必須被說(shuō)明成引用也必須被說(shuō)明成引用“complex& com”complex& com”,目的則是要將輸入數(shù)據(jù)直接賦值給對(duì)應(yīng)實(shí)參變量(所目的則是要將輸入數(shù)據(jù)直接賦值給對(duì)應(yīng)實(shí)參變量(所擁有的存儲(chǔ)空間中)。擁有的存儲(chǔ)空間中)。
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; /不可缺少,因?yàn)楹瘮?shù)返回類型為不可缺少,因?yàn)楹瘮?shù)返回類型為“
14、istream&” ostream& operator (ostream& out, complex com) out(com.r, com.i)endl;return out; /不可缺少,因?yàn)楹瘮?shù)返回類型為不可缺少,因?yàn)楹瘮?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; /* 注意輸入輸出語(yǔ)句中出現(xiàn)的注意輸入輸出語(yǔ)句中出現(xiàn)的類對(duì)象類對(duì)象cout以及以
15、及cin正是正是輸輸入輸出重載函數(shù)中入輸出重載函數(shù)中引用型形參引用型形參out以及以及in的對(duì)應(yīng)實(shí)參的對(duì)應(yīng)實(shí)參。即是說(shuō),。即是說(shuō),若使用若使用“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 對(duì)輸入輸出格式進(jìn)行控制對(duì)輸入輸出格式進(jìn)行控制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ù)來(lái)設(shè)置標(biāo)志位,然后再使成員函數(shù),通常先用某些成員函數(shù)來(lái)設(shè)置標(biāo)志位,然后再使用另一些成員函數(shù)來(lái)進(jìn)行格式輸出。另外,用另一些成員函數(shù)來(lái)進(jìn)行格式輸出
17、。另外,iosios類中還設(shè)置了類中還設(shè)置了一個(gè)一個(gè)longlong型的數(shù)據(jù)成員用來(lái)記錄當(dāng)前被設(shè)置的格式狀態(tài),該型的數(shù)據(jù)成員用來(lái)記錄當(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)志位來(lái)由格式控制標(biāo)志位來(lái)“合成合成”的。的。 注意,注意,iosios類作為諸多類作為諸多I/OI/O流類的基類,其公有成員函數(shù)流類的基類,其公有成員函數(shù)當(dāng)然可被各派生類的對(duì)象所直接調(diào)用。當(dāng)然可被各派生類的對(duì)象所直接調(diào)用。14 (1) (1) iosios:flags:flags a.a. 格式一格式一: : long
18、 flags( long long flags( long lFlagslFlags ); ); 通過參數(shù)通過參數(shù)lFlagslFlags來(lái)重新設(shè)置來(lái)重新設(shè)置標(biāo)志字標(biāo)志字。 表示各表示各標(biāo)志位標(biāo)志位的枚舉常量有的枚舉常量有( (參看參看p235)p235):iosios:skipwsskipwsiosios:left :left iosios:right :right .iosios:stdiostdio 每一枚舉常量值都代表著格式控制標(biāo)志字中的某一個(gè)二每一枚舉常量值都代表著格式控制標(biāo)志字中的某一個(gè)二進(jìn)制位進(jìn)制位( (bit)bit),當(dāng)設(shè)置了某個(gè)標(biāo)志位屬性時(shí),該位將取值當(dāng)設(shè)置了某個(gè)標(biāo)志位屬性
19、時(shí),該位將取值“1”“1”,否則該位取值,否則該位取值“0”“0”。 15 另外注意,通過另外注意,通過使用位運(yùn)算符使用位運(yùn)算符“|”“|”可將多個(gè)格式控制可將多個(gè)格式控制標(biāo)志位屬性進(jìn)行標(biāo)志位屬性進(jìn)行“合成合成”。但從使用角度看,。但從使用角度看,所設(shè)置的標(biāo)所設(shè)置的標(biāo)志位屬性不能產(chǎn)生互斥志位屬性不能產(chǎn)生互斥。例如,格式控制標(biāo)志字中設(shè)立了。例如,格式控制標(biāo)志字中設(shè)立了三個(gè)平行的標(biāo)志位三個(gè)平行的標(biāo)志位( (iosios:decdec、iosios:octoct和和iosios:hex):hex)用于用于表示數(shù)制,程序員應(yīng)保障任何時(shí)刻只設(shè)置其中的某一個(gè)標(biāo)表示數(shù)制,程序員應(yīng)保障任何時(shí)刻只設(shè)置其中的某一
20、個(gè)標(biāo)志位。還有表示對(duì)齊標(biāo)志位的志位。還有表示對(duì)齊標(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í) 數(shù) 格 式 標(biāo) 志 位 的以 及 表 示 實(shí) 數(shù) 格 式 標(biāo) 志 位 的iosios:scientific:scientific和和iosios:fixed:fixed,這些互斥屬性也不能同時(shí)這些互斥屬性也不能同時(shí)設(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來(lái)設(shè)置指定的格式控制標(biāo)志位。來(lái)設(shè)置指定的格式控制標(biāo)志位。 注意,與注意,與flagsflags函數(shù)的函數(shù)的“替換替換”方式不同,此處為方式不同,此處為“添加添加”方式,即是說(shuō),它并不更改其它方式,即是說(shuō),它并不更改其它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所給定的值來(lái)所給定的值來(lái)重置這些標(biāo)志位)。重置這些標(biāo)志位)。 17 例如,為保障所設(shè)置的數(shù)制標(biāo)志位不產(chǎn)生互斥,當(dāng)要設(shè)例如,為保障所設(shè)置的數(shù)制標(biāo)志位不產(chǎn)生互斥,當(dāng)要設(shè)置置16進(jìn)制時(shí)使用:進(jìn)制時(shí)使用: setf(ios:hex, ios:basefield); 其中的其中的ios:bas
23、efield為一個(gè)在為一個(gè)在ios類中定義的公有靜態(tài)常類中定義的公有靜態(tài)常量,它的取值為量,它的取值為ios:dec|ios:oct|ios:hex。 同理,當(dāng)要設(shè)置對(duì)齊標(biāo)志位為同理,當(dāng)要設(shè)置對(duì)齊標(biāo)志位為ios:right以及實(shí)數(shù)格式標(biāo)以及實(shí)數(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來(lái)清除指定的格式控制標(biāo)志位。來(lái)清除指定的格式控制標(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è)置浮點(diǎn)數(shù)精度為設(shè)置浮點(diǎn)數(shù)精度為npnp并返回原精度。當(dāng)格式為并返回原精度。當(dāng)格式為iosios:scientific:scientific或或iosios:fixed:fixed時(shí),精度時(shí),精度npnp指小數(shù)點(diǎn)后的位指小數(shù)點(diǎn)后的位數(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ū)?。默認(rèn)值并返回原域?qū)?。默認(rèn)值為為0 0,將按實(shí)際需要的域?qū)掃M(jìn)行輸出。此設(shè)置只對(duì)隨后的一,將按實(shí)際需要的域?qū)掃M(jìn)行輸出。此設(shè)置只對(duì)隨后的一個(gè)數(shù)據(jù)有效,而后系統(tǒng)立刻恢復(fù)域?qū)挒橄到y(tǒng)默認(rèn)值個(gè)數(shù)據(jù)有效,而后系統(tǒng)立刻恢復(fù)域?qū)挒橄到y(tǒng)默認(rèn)值0 0。20 2. 2. 常用的輸入輸出格式控制符常用的輸入輸出格式控制符 可直接用于提取和插入算符可直接用于提取和插入算符(“”(“”和和“”)“”)之后,而之后,而不像格式控制成員函數(shù)那樣必須被單獨(dú)調(diào)用。不像格式控制成員函數(shù)那樣必須被單獨(dú)調(diào)用。 (1)
27、(1) iostreamiostream.h.h中含有的無(wú)參格式控制符中含有的無(wú)參格式控制符( (參看參看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 lFla
28、gslFlags ) ). . 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() co
29、utios 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:showbase
30、); 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.unset
31、f(ios:showpoint); coutcout.flags()endl; /輸出:輸出:128 242. 格式控制示例二格式控制示例二 對(duì)輸出數(shù)據(jù)的寬度、精度等方面進(jìn)行設(shè)置與使用。對(duì)輸出數(shù)據(jù)的寬度、精度等方面進(jìn)行設(shè)置與使用。#include void main() cout.width(6); /只管隨后一個(gè)數(shù)的域?qū)捴还茈S后一個(gè)數(shù)的域?qū)?cout478527.4272endl; / 478527.4272coutsetw(6)4785setw(8)27.4272endlendl; / 4785 27.4272cout.width(6);cout.precision(3); /當(dāng)格式為當(dāng)格
32、式為ios:scientific或或ios:fixed時(shí),浮點(diǎn)數(shù)精度時(shí),浮點(diǎn)數(shù)精度 /np指小數(shù)點(diǎn)后的位數(shù),否則指有效數(shù)字指小數(shù)點(diǎn)后的位數(shù),否則指有效數(shù)字 /此時(shí)設(shè)置浮點(diǎn)數(shù)的有效數(shù)字為此時(shí)設(shè)置浮點(diǎn)數(shù)的有效數(shù)字為3cout4785setw(8)27.4272endl; / 4785 27.4 25coutsetw(6)4785setw(8)setprecision(2)27.4272endlendl; / 4785 27 /“setprecision(2)”設(shè)置浮點(diǎn)數(shù)的有效數(shù)字設(shè)置浮點(diǎn)數(shù)的有效數(shù)字cout.setf(ios:fixed, ios:floatfield); /今后以定點(diǎn)格式顯示浮點(diǎn)
33、數(shù)今后以定點(diǎn)格式顯示浮點(diǎn)數(shù)(無(wú)指數(shù)部分無(wú)指數(shù)部分)cout.width(6); cout.precision(3); /當(dāng)格式為當(dāng)格式為ios:fixed時(shí),設(shè)置小數(shù)點(diǎn)后的位數(shù)時(shí),設(shè)置小數(shù)點(diǎn)后的位數(shù)cout4785setw(8)27.4272 = 讀寫操作讀寫操作 = = 關(guān)閉文件關(guān)閉文件。 27 “打開文件打開文件”通常通過構(gòu)造函數(shù)自動(dòng)完成(也可顯式調(diào)通常通過構(gòu)造函數(shù)自動(dòng)完成(也可顯式調(diào)用成員函數(shù)用成員函數(shù)openopen完成)。完成)?!瓣P(guān)閉文件關(guān)閉文件”通常通過使用通常通過使用“.close();”close();”來(lái)顯式完成。來(lái)顯式完成。 例例1: 1: ofstreamofstrea
34、m outfile1(myfile1.txt); outfile1(myfile1.txt); 創(chuàng)建創(chuàng)建ofstreamofstream類的對(duì)象類的對(duì)象outfile1outfile1;使流類對(duì)象使流類對(duì)象outfile1outfile1與與磁盤文件磁盤文件 myfile1.txtmyfile1.txt相聯(lián)系;并打開用于相聯(lián)系;并打開用于“寫寫”的磁盤的磁盤文件文件 myfile1.txtmyfile1.txt。 例例2: 2: ofstreamofstream outfile1; outfile1; / /創(chuàng)建創(chuàng)建ofstreamofstream類的對(duì)象類的對(duì)象outfile1outfile
35、1 outfile1.open(myfile1.txt); outfile1.open(myfile1.txt); / /顯式調(diào)用成員函數(shù)顯式調(diào)用成員函數(shù)openopen來(lái)打開文件來(lái)打開文件28 二二. 與創(chuàng)建流類對(duì)象相關(guān)的三個(gè)構(gòu)造函數(shù)與創(chuàng)建流類對(duì)象相關(guān)的三個(gè)構(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:i
36、n - 以讀以讀(輸入輸入)為目的打開。為目的打開。 ios:nocreate - 僅打開一個(gè)已存在文件。僅打開一個(gè)已存在文件。 ios:binary - 打開二進(jìn)制文件。打開二進(jìn)制文件。 (3) nProt - 指定所打開文件的保護(hù)方式。指定所打開文件的保護(hù)方式。29 2. ofstream:ofstream ofstream( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot ); 參數(shù)參數(shù): (1) szName - 文件名;文件名; (2) nMode - 打開文件的方式。打開文件的方式。 ios
37、:out - 以寫以寫(輸出輸出)為目的打開文件。為目的打開文件。 ios:trunc - 若文件存在,則將文件長(zhǎng)度截為若文件存在,則將文件長(zhǎng)度截為0。 ios:binary - 打開二進(jìn)制文件。打開二進(jìn)制文件。 ios:app - 以追加方式打開。以追加方式打開。 . (3) nProt - 指定所打開文件的保護(hù)方式。指定所打開文件的保護(hù)方式。 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)建流類對(duì)象相關(guān)的三個(gè)與創(chuàng)建流類對(duì)象相關(guān)的三個(gè)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 n
39、Mode, int nProt = filebuf:openprot ); 3110.4.2 讀寫操作示例讀寫操作示例 - - 參看書參看書p246, 10.6.2p246, 10.6.2小節(jié)的小節(jié)的1 1 對(duì)文件的對(duì)文件的“讀寫操作讀寫操作”通常使用預(yù)定義的通常使用預(yù)定義的類成員函數(shù)類成員函數(shù)來(lái)實(shí)現(xiàn)(隨后介紹),但也可使用繼承而來(lái)的來(lái)實(shí)現(xiàn)(隨后介紹),但也可使用繼承而來(lái)的插入和提取運(yùn)插入和提取運(yùn)算符算符“”“”和和“”“”operator ”,所以,所以,ifstreamifstream流(類對(duì)象)可以使用預(yù)定義的算符流(類對(duì)象)可以使用預(yù)定義的算符“”“”來(lái)對(duì)自來(lái)對(duì)自定義磁盤文件進(jìn)行定義磁
40、盤文件進(jìn)行“讀讀”操作(允許通過派生類對(duì)象直接調(diào)操作(允許通過派生類對(duì)象直接調(diào)用其基類的公有成員函數(shù));用其基類的公有成員函數(shù)); ofstreamofstream類由類由ostreamostream類所派生類所派生,而,而ostreamostream類中預(yù)定義類中預(yù)定義了公有的運(yùn)算符了公有的運(yùn)算符重載函數(shù)重載函數(shù)“operator ”operator ”,所以,所以,ofstreamofstream流(類對(duì)象)可以使用預(yù)定義的算符流(類對(duì)象)可以使用預(yù)定義的算符“”“”“”和和“”“”來(lái)對(duì)自定義磁盤文件進(jìn)行來(lái)對(duì)自定義磁盤文件進(jìn)行“讀讀” ” 與與“寫寫”操作。操作。 還有一點(diǎn)需要注意:使用預(yù)
41、定義的算符還有一點(diǎn)需要注意:使用預(yù)定義的算符“”“”“”來(lái)進(jìn)行來(lái)進(jìn)行“讀讀”操作操作時(shí)遇空格或換行均結(jié)束一個(gè)數(shù)據(jù)相呼應(yīng)。時(shí)遇空格或換行均結(jié)束一個(gè)數(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! N
42、ankai_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ù)對(duì)文件流進(jìn)行操作使用類成員函數(shù)對(duì)文件流進(jìn)行操作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.2
44、小節(jié)的小節(jié)的2 2 ostreamostream& put( char & put( char chch ); );功能:將字符功能:將字符chch寫到自定義文件中。寫到自定義文件中。 istreamistream& get( char& & get( char& rchrch ); );功能:從自定義文件中讀出功能:從自定義文件中讀出1 1個(gè)字符放入引用個(gè)字符放入引用rchrch中。中。 注意,注意,putput實(shí)際上只是實(shí)際上只是ostreamostream類中定義的公有成員類中定義的公有成員函數(shù),當(dāng)然通過其派生類函數(shù),當(dāng)然通過其派生類ofstreamofstream的類對(duì)象也可以直接的類
45、對(duì)象也可以直接對(duì)它進(jìn)行調(diào)用。同理,通過對(duì)它進(jìn)行調(diào)用。同理,通過ifstreamifstream的類對(duì)象可以直接的類對(duì)象可以直接調(diào)用調(diào)用getget。37 1. 程序示例一程序示例一 從鍵盤輸入任一個(gè)字符串,通過從鍵盤輸入任一個(gè)字符串,通過put將其寫到自定義磁盤文件將其寫到自定義磁盤文件“putgetfile.txt”中,而后再使用中,而后再使用get從該文件中讀出所寫串并顯示在屏幕上。從該文件中讀出所寫串并顯示在屏幕上。 #include #include void main() /鍵盤輸入字符串,通過鍵盤輸入字符串,通過put將其寫到自定義磁盤文件中將其寫到自定義磁盤文件中char str
46、80;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)前符號(hào)非文件結(jié)束符時(shí)繼續(xù)當(dāng)前符號(hào)非文件結(jié)束符時(shí)繼續(xù)) /注注: 成員函數(shù)成員函數(shù)eo
47、f()在讀到文件結(jié)束時(shí)方返回在讀到文件結(jié)束時(shí)方返回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. 程序示例二程序示例二 - 對(duì)指定文件進(jìn)行拷貝對(duì)指定文件進(jìn)行拷貝 使用類成員函數(shù)使用類成員函數(shù)get與與put對(duì)指定文件進(jìn)行拷貝。被拷貝對(duì)指定文件進(jìn)行拷貝。被拷貝的的“源文件源文件”以及
48、拷貝到的以及拷貝到的“目的文件目的文件”的名字與路徑均由的名字與路徑均由命令行參數(shù)來(lái)提供。命令行參數(shù)來(lái)提供。 程序執(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ù)個(gè)數(shù)不對(duì)時(shí)若提供的命令行參數(shù)個(gè)數(shù)不對(duì)時(shí)):ERROR ! - supplying 2 command-line argements ?!40 #include #include void main(int argc, char* argv) if(arg
49、c!=3) /命令行參數(shù)個(gè)數(shù)不對(duì)時(shí)命令行參數(shù)個(gè)數(shù)不對(duì)時(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.ge
50、t(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對(duì)二進(jìn)制文件對(duì)二進(jìn)制文件(binary file)進(jìn)行讀寫。進(jìn)行讀寫。 ostream& write( const char* pch, int nCount ); 功能:將功能:將pch緩沖區(qū)中的前緩沖區(qū)中的前nCount個(gè)字符寫出到某個(gè)文件中。個(gè)字符寫出到某個(gè)文件中。istream& read( char
51、* pch, int nCount ); 功能:從某個(gè)文件中讀入功能:從某個(gè)文件中讀入nCount個(gè)字符放入個(gè)字符放入pch緩沖區(qū)中緩沖區(qū)中(若讀至文件結(jié)束尚不足(若讀至文件結(jié)束尚不足nCount個(gè)字符時(shí),也將立即結(jié)束個(gè)字符時(shí),也將立即結(jié)束本次讀取過程)。本次讀取過程)。 注意:使用注意:使用write與與read進(jìn)行數(shù)據(jù)讀寫時(shí),不必要在數(shù)據(jù)進(jìn)行數(shù)據(jù)讀寫時(shí),不必要在數(shù)據(jù)間再額外間再額外“插入插入”分割符,這是因?yàn)樗鼈兌家筇峁┑诙指罘@是因?yàn)樗鼈兌家筇峁┑诙?shí)參來(lái)指定讀寫長(zhǎng)度。實(shí)參來(lái)指定讀寫長(zhǎng)度。42 以下的示例程序先使用以下的示例程序先使用write往自定義二進(jìn)制磁盤文件往自定義二進(jìn)制
52、磁盤文件中寫出如下中寫出如下3個(gè)個(gè)“值值”:字符串:字符串str的長(zhǎng)度值的長(zhǎng)度值Len(一個(gè)正整一個(gè)正整數(shù)數(shù))、字符串、字符串str本身、以及一個(gè)結(jié)構(gòu)體的數(shù)據(jù),而后再使用本身、以及一個(gè)結(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;o
53、fstream fout(wrt_read_file.bin, ios:binary); /打開用于打開用于“寫寫”的二進(jìn)制磁盤文件的二進(jìn)制磁盤文件int Len=strlen(str);fout.write( (char*)(&Len), sizeof(int) ); fout.write(str, Len); /數(shù)據(jù)間無(wú)需分割符數(shù)據(jù)間無(wú)需分割符fout.write(char*)(&ss), sizeof(ss); fout.close();cout-endl;cout- READ it from wrt_read_file.bin -endl;char str280;ifstream fi
54、n(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; coutss.name,ss.age,ss.scoreendl; fin.close(); cout-wu jun,22,91.5-45 最常用格式為:最常用格式為:istream& getline( char* pch, int nCo
55、unt, char delim = n ); 功能:從某個(gè)文件中讀出一行功能:從某個(gè)文件中讀出一行(至多至多nCount個(gè)字符個(gè)字符)放入放入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 line81
56、; ifstream infile(“getline_1.cpp”); /打開文件用于讀打開文件用于讀 infile.getline(line, 80); /讀出一行讀出一行(至多至多80個(gè)字符個(gè)字符)放入放入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 對(duì)對(duì)text文件與文件與binary文件的
57、一般使用示例文件的一般使用示例10.6.2 采用采用binary文件形式對(duì)結(jié)構(gòu)體數(shù)據(jù)文件形式對(duì)結(jié)構(gòu)體數(shù)據(jù)進(jìn)行存儲(chǔ)與讀寫處理進(jìn)行存儲(chǔ)與讀寫處理- 10.6.1 對(duì)對(duì)text文件與文件與binary文件的一般使用示例文件的一般使用示例 * 以以text形式存儲(chǔ)形式存儲(chǔ),優(yōu)點(diǎn)優(yōu)點(diǎn)是具有較高的兼容性。是具有較高的兼容性。缺點(diǎn)缺點(diǎn)是是存儲(chǔ)一批純數(shù)值信息時(shí),要在數(shù)據(jù)之間人為地添加分割符;存儲(chǔ)一批純數(shù)值信息時(shí),要在數(shù)據(jù)之間人為地添加分割符;輸入輸出過程中,系統(tǒng)要對(duì)內(nèi)外存的數(shù)據(jù)格式進(jìn)行相應(yīng)轉(zhuǎn)輸入輸出過程中,系統(tǒng)要對(duì)內(nèi)外存的數(shù)據(jù)格式進(jìn)行相應(yīng)轉(zhuǎn)換;另外換;另外text文件不便于對(duì)數(shù)據(jù)實(shí)行隨機(jī)訪問。文件不便于對(duì)數(shù)據(jù)
58、實(shí)行隨機(jī)訪問。48 * * 以以binarybinary形式存儲(chǔ)形式存儲(chǔ),優(yōu)點(diǎn)優(yōu)點(diǎn)是便于對(duì)數(shù)據(jù)實(shí)行隨機(jī)訪是便于對(duì)數(shù)據(jù)實(shí)行隨機(jī)訪問(每一同類型數(shù)據(jù)所占磁盤空間的大小均相同,不必在問(每一同類型數(shù)據(jù)所占磁盤空間的大小均相同,不必在數(shù)據(jù)之間人為地添加分割符);輸入輸出過程中,系統(tǒng)不數(shù)據(jù)之間人為地添加分割符);輸入輸出過程中,系統(tǒng)不對(duì)數(shù)據(jù)進(jìn)行任何轉(zhuǎn)換。對(duì)數(shù)據(jù)進(jìn)行任何轉(zhuǎn)換。缺點(diǎn)缺點(diǎn)是兼容性低。是兼容性低。 注:由程序員決定將數(shù)據(jù)存儲(chǔ)為注:由程序員決定將數(shù)據(jù)存儲(chǔ)為texttext文件或者文件或者binarybinary文文件兩種形式之一。件兩種形式之一。 缺省打開方式時(shí),默認(rèn)為缺省打開方式時(shí),默認(rèn)為tex
59、ttext文件形式。若欲使用文件形式。若欲使用binarybinary文件形式,要將打開方式設(shè)為文件形式,要將打開方式設(shè)為“iosios:binary”:binary”。 通常將純文本信息(如字符串)以通常將純文本信息(如字符串)以texttext文件形式存儲(chǔ),文件形式存儲(chǔ),而將數(shù)值信息以而將數(shù)值信息以binarybinary文件形式存儲(chǔ)。文件形式存儲(chǔ)。 49 1. 1. 示例示例1 - 1 - 對(duì)兩種文件進(jìn)行操作對(duì)兩種文件進(jìn)行操作 將將a a數(shù)組中準(zhǔn)備好的數(shù)組中準(zhǔn)備好的8 8個(gè)個(gè)intint型數(shù)據(jù),分別通過算符型數(shù)據(jù),分別通過算符“”“”依次寫出到依次寫出到texttext文件文件ft.tx
60、tft.txt之中(注意各數(shù)據(jù)在文件中之中(注意各數(shù)據(jù)在文件中“長(zhǎng)短長(zhǎng)短”不一,且數(shù)據(jù)間必須加入分割符)。而且還通過不一,且數(shù)據(jù)間必須加入分割符)。而且還通過使用類成員函數(shù)使用類成員函數(shù)writewrite將這相同的將這相同的8 8個(gè)個(gè)intint型數(shù)據(jù)依次寫出到型數(shù)據(jù)依次寫出到binarybinary文件文件fbfb.bin.bin之中(注意各數(shù)據(jù)在文件中之中(注意各數(shù)據(jù)在文件中“長(zhǎng)短長(zhǎng)短”相相同,且數(shù)據(jù)間不需要加入分割符)。同,且數(shù)據(jù)間不需要加入分割符)。 另外,程序中通過使用無(wú)參的成員函數(shù)另外,程序中通過使用無(wú)參的成員函數(shù)“tellptellp()”()”來(lái)來(lái)獲取當(dāng)前已寫出到各文件的位置
61、信息,以確認(rèn)每一數(shù)據(jù)在獲取當(dāng)前已寫出到各文件的位置信息,以確認(rèn)每一數(shù)據(jù)在文件中所占的字節(jié)數(shù)。文件中所占的字節(jié)數(shù)。 ostreamostream:tellptellp之功能為:獲取并返回之功能為:獲取并返回“輸出指針輸出指針”的當(dāng)前位置值(從文件首到當(dāng)前位置的字節(jié)數(shù))。的當(dāng)前位置值(從文件首到當(dāng)前位置的字節(jié)數(shù))。 50 #include void main() int a8=0,1,-1,1234567890; for(int i=4; i8; i+) ai=876543210+i-4; /均由均由9位數(shù)字組成,在位數(shù)字組成,在text文件中所占字節(jié)數(shù)也為文件中所占字節(jié)數(shù)也為9 ofstream
62、 ft(ft.txt); ofstream fb(fb.bin, ios:binary); for(i=0; i8; i+) ftai ;/數(shù)據(jù)間需要添加分割符數(shù)據(jù)間需要添加分割符 fb.write(char*)(&ai), sizeof(ai); /數(shù)據(jù)間不需分割符數(shù)據(jù)間不需分割符 coutft.tellp()=ft.tellp(), ; /當(dāng)前當(dāng)前ft文件位置文件位置 coutfb.tellp()=fb.tellp()endl; /當(dāng)前當(dāng)前fb文件位置文件位置 ft.close(); fb.close(); 51 程序執(zhí)行后的輸出結(jié)果如下:程序執(zhí)行后的輸出結(jié)果如下:ft.tellp()=2
63、, fb.tellp()=4ft.tellp()=4, fb.tellp()=8ft.tellp()=7, fb.tellp()=12ft.tellp()=18, fb.tellp()=16ft.tellp()=28, fb.tellp()=20ft.tellp()=38, fb.tellp()=24ft.tellp()=48, fb.tellp()=28ft.tellp()=58, fb.tellp()=3252 *2. 示例示例2 - 使用使用read與與write對(duì)對(duì)text文件進(jìn)行操作時(shí)可能出錯(cuò)文件進(jìn)行操作時(shí)可能出錯(cuò) 具體程序從略。具體程序從略。 評(píng)注:評(píng)注: (1)通常使用通常使用r
64、ead與與write對(duì)二進(jìn)制文件進(jìn)行操作,但若非要使用它們對(duì)文對(duì)二進(jìn)制文件進(jìn)行操作,但若非要使用它們對(duì)文本文件進(jìn)行操作時(shí),系統(tǒng)在本文件進(jìn)行操作時(shí),系統(tǒng)在write時(shí)有可能多寫出了一些東西(如,回車換行時(shí)有可能多寫出了一些東西(如,回車換行符號(hào)等)。這樣將導(dǎo)致符號(hào)等)。這樣將導(dǎo)致read時(shí)產(chǎn)生錯(cuò)誤。時(shí)產(chǎn)生錯(cuò)誤。 (2)read與與write功能的進(jìn)一步解釋:功能的進(jìn)一步解釋: istream:read Extracts bytes from the stream until the limit nCount is reached or until the end of file is reach
65、ed. The read function is useful for binary stream input. ostream:write Inserts a specified number of bytes from a buffer into the stream. If the underlying file was opened in text mode, additional carriage return characters may be inserted. The write function is useful for binary stream output. 5310
66、.6.2 10.6.2 采用采用binarybinary文件形式對(duì)結(jié)構(gòu)體文件形式對(duì)結(jié)構(gòu)體 數(shù)據(jù)進(jìn)行存儲(chǔ)與讀寫處理數(shù)據(jù)進(jìn)行存儲(chǔ)與讀寫處理 從鍵盤讀入多個(gè)結(jié)構(gòu)數(shù)據(jù)從鍵盤讀入多個(gè)結(jié)構(gòu)數(shù)據(jù)(個(gè)數(shù)個(gè)數(shù)n由用戶指定由用戶指定),使用,使用write將這些結(jié)將這些結(jié)構(gòu)數(shù)據(jù)寫出到某個(gè)自定義二進(jìn)制磁盤文件中,而后再使用構(gòu)數(shù)據(jù)寫出到某個(gè)自定義二進(jìn)制磁盤文件中,而后再使用read讀出這些讀出這些結(jié)構(gòu)數(shù)據(jù)并進(jìn)行處理結(jié)構(gòu)數(shù)據(jù)并進(jìn)行處理(如,求出如,求出n個(gè)個(gè)score的平均值的平均值ave)。#include void main() struct person char name 20; int age; float score; ss;int n;cinn; /個(gè)數(shù)個(gè)數(shù)n由用戶指定由用戶指定54 ofstream fout(f01.bin, ios:binary); /打開二進(jìn)制文件(寫)打開二進(jìn)制文件(寫) for(int i=0; iss.namess.agess.score; fout.write( (char *)(&ss), sizeof(ss); /寫到文件中寫到文件中 fout.close();
- 溫馨提示:
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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案