![c++13上海交大(針對譚浩強(qiáng)的書)_第1頁](http://file4.renrendoc.com/view/99bb8f0e00ea91f486e2c1ab2d20ef2b/99bb8f0e00ea91f486e2c1ab2d20ef2b1.gif)
![c++13上海交大(針對譚浩強(qiáng)的書)_第2頁](http://file4.renrendoc.com/view/99bb8f0e00ea91f486e2c1ab2d20ef2b/99bb8f0e00ea91f486e2c1ab2d20ef2b2.gif)
![c++13上海交大(針對譚浩強(qiáng)的書)_第3頁](http://file4.renrendoc.com/view/99bb8f0e00ea91f486e2c1ab2d20ef2b/99bb8f0e00ea91f486e2c1ab2d20ef2b3.gif)
![c++13上海交大(針對譚浩強(qiáng)的書)_第4頁](http://file4.renrendoc.com/view/99bb8f0e00ea91f486e2c1ab2d20ef2b/99bb8f0e00ea91f486e2c1ab2d20ef2b4.gif)
![c++13上海交大(針對譚浩強(qiáng)的書)_第5頁](http://file4.renrendoc.com/view/99bb8f0e00ea91f486e2c1ab2d20ef2b/99bb8f0e00ea91f486e2c1ab2d20ef2b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第十三章
輸入輸出流與文件的輸入輸出C++語言程序設(shè)計計算機(jī)基礎(chǔ)教學(xué)研究室主要內(nèi)容13.1C++的輸入和輸出13.2標(biāo)準(zhǔn)輸出流13.3標(biāo)準(zhǔn)輸入流13.4文件操作與文件流13.5字符串流輸入輸出類的繼承關(guān)系iosistreamostreamifstreamofstreamiostreamfstreamistringstreamostringstreamstringstream以前所用到的輸入和輸出,都是以終端為對象的,即從鍵盤輸入數(shù)據(jù),運行結(jié)果輸出到顯示器屏幕上。除了以終端為對象進(jìn)行輸入和輸出外,還經(jīng)常用磁盤(光盤)作為輸入輸出對象,磁盤文件既可以作為輸入文件,也可以作為輸出文件。程序的輸入指的是從輸入文件將數(shù)據(jù)傳送給程序,程序的輸出指的是從程序?qū)?shù)據(jù)傳送給輸出文件。13.1C++的輸入和輸出
13.1.1輸入輸出的含義C++的輸入與輸出包括以下3方面的內(nèi)容:(1)對系統(tǒng)指定的標(biāo)準(zhǔn)設(shè)備的輸入和輸出。即從鍵盤輸入數(shù)據(jù),輸出到顯示器屏幕。這種輸入輸出稱為標(biāo)準(zhǔn)的輸入輸出,簡稱標(biāo)準(zhǔn)I/O。(2)以外存磁盤文件為對象進(jìn)行輸入和輸出,即從磁盤文件輸入數(shù)據(jù),數(shù)據(jù)輸出到磁盤文件。以外存文件為對象的輸入輸出稱為文件的輸入輸出,簡稱文件I/O。(3)對內(nèi)存中指定的空間進(jìn)行輸入和輸出。通常指定一個字符數(shù)組作為存儲空間(實際上可以利用該空間存儲任何信息)。這種輸入和輸出稱為字符串輸入輸出,簡稱串I/O。C++采取不同的方法來實現(xiàn)以上3種輸入輸出。為了實現(xiàn)數(shù)據(jù)的有效流動,C++系統(tǒng)提供了龐大的I/O類庫,調(diào)用不同的類去實現(xiàn)不同的功能。在C++的輸入輸出中,編譯系統(tǒng)對數(shù)據(jù)類型進(jìn)行嚴(yán)格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過編譯。因此C++的I/O操作是類型安全(typesafe)的。
C++的I/O操作是可擴(kuò)展的,不僅可以用來輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)據(jù)。C++對標(biāo)準(zhǔn)類型的數(shù)據(jù)和對用戶聲明類型數(shù)據(jù)的輸入輸出,采用同樣的方法處理。
C++通過I/O類庫來實現(xiàn)豐富的I/O功能。C++的輸入輸出優(yōu)于C語言中的printf和scanf,但是比較復(fù)雜,要掌握許多細(xì)節(jié)。13.1.2C++的I/O是對C的發(fā)展
——類型安全和可擴(kuò)展性
C++的輸入輸出流是指由若干字節(jié)組成的字節(jié)序列,這些字節(jié)中的數(shù)據(jù)按順序從一個對象傳送到另一對象。流表示了信息從源到目的端的流動。在輸入操作時,字節(jié)流從輸入設(shè)備(如鍵盤、磁盤)流向內(nèi)存,在輸出操作時,字節(jié)流從內(nèi)存流向輸出設(shè)備(如屏幕、打印機(jī)、磁盤等)。流中的內(nèi)容可以是ASCII字符、二進(jìn)制形式的數(shù)據(jù)、圖形圖像、數(shù)字音頻視頻或其他形式的信息。在內(nèi)存中為每一個數(shù)據(jù)流開辟一個內(nèi)存緩沖區(qū),用來存放流中的數(shù)據(jù)。流是與內(nèi)存緩沖區(qū)相對應(yīng)的,或者說,緩沖區(qū)中的數(shù)據(jù)就是流。13.1.3C++的輸入輸出流I/O流的結(jié)構(gòu)流類庫i/ostreamistreamostreamiosios類提供關(guān)于對流狀態(tài)進(jìn)行設(shè)置的功能,它是一個基類istream類提供向流中插入數(shù)據(jù)的有關(guān)操作ostream類提供從流中提取數(shù)據(jù)的有關(guān)操作streambufstreambuf類是為ios類及其派生類提供對數(shù)據(jù)的緩沖支持上面類派生定義了幾個描述文件抽象的類:ifstream類:從istream類派生的,功能是對文件進(jìn)行輸入操作ofstream類:從ostream類派生的,功能是對文件進(jìn)行輸出操作fstream類:對文件進(jìn)行插入和提取操作filebuf類:從streambuf類派生的,作為上述類的緩沖支持圖13.2I/O類庫中還有其他類,見圖13.3。圖13.3*********
C++編譯系統(tǒng)提供了用于輸入輸出的iostream類庫。在iostream類庫中包含許多用于輸入輸出的類。
ios是抽象基類,由它派生出istream類和ostream類。istream類支持輸入操作,ostream類支持輸出操作。iostream類是從istream類和ostream類通過多重繼承而派生的類。它支持輸入輸出雙向操作,其繼承層次見圖13.1表示。1.iostream類庫中有關(guān)的類
頭文件是程序與類庫的接口,iostream類庫的接口分別由不同的頭文件來實現(xiàn)。常用的有iostream包含了對輸入輸出流進(jìn)行操作所需的基本信息。fstream用于用戶管理的文件的I/O操作。strstream用于字符串流I/O。stdiostream用于混合使用C和C++的I/O機(jī)制時。iomanip在使用格式化I/O時應(yīng)包含此頭文件。2.常見與iostream類庫有關(guān)的頭文件3.系統(tǒng)定義的I/O流類對象“<<”和“>>”本來在C++中是被定義為左位移運算符和右位移運算符的,由于在iostream頭文件中對它們進(jìn)行了重載,使它們能用作標(biāo)準(zhǔn)類型數(shù)據(jù)的輸入和輸出運算符。在用它們的程序中必須用#include<iostream>輸出操作由重載的插入符“<<”實現(xiàn)輸入操作由重載的提取符“>>”實現(xiàn)系統(tǒng)預(yù)定好了4個流類對象,供用戶使用:cin:它是istream類的對象,用來處理標(biāo)準(zhǔn)輸入,即鍵盤輸入cout:它是ostream類的對象,用來處理標(biāo)準(zhǔn)輸出,即屏幕輸出cerr:它是ostream類的對象,用來處理標(biāo)準(zhǔn)出錯信息,不帶緩沖區(qū)的輸出,即發(fā)給它的內(nèi)容立即輸出clog:它是ostream類的對象,用來處理標(biāo)準(zhǔn)出錯信息,帶緩沖區(qū)的輸出,緩沖區(qū)滿時被輸出如果在程序中有下面的表達(dá)式:cout<<″C++″;表達(dá)式相當(dāng)于:cout.operator<<(″C++″)″C++″的值是其首字節(jié)地址,是字符型指針(char*)類型,函數(shù)返回流對象cout。
在istream類、ostream類中已將運算符“>>”、“<<”重載為對以下標(biāo)準(zhǔn)類型的插入和提取運算符:char,signedchar,unsignedchar,short,unsignedshort,int,unsigned
int,long,unsignedlong,float,double,longdouble,char*,signedchar*,unsignedchar*等。所以,“<<”和“>>”運行符可以輸入、輸出各種類型的數(shù)據(jù)。例13.1有一元二次方程ax2+bx+c=0,其一般解為x1,2=(-b±b2-4ac)/2a,但若a=0,或b2-4ac<0時,用此公式出錯。編程序,從鍵盤輸入a,b,c的值,求x1和x2。如果a=0或b2-4ac<0,輸出出錯信息。#include<iostream>#include<cmath>usingnamespacestd;13.2標(biāo)準(zhǔn)輸出流
13.2.1標(biāo)準(zhǔn)輸入、輸出流對象的使用intmain(){floata,b,c,disc;
cout<<″pleaseinputa,b,c:″;
cin>>a>>b>>c;if(a==0)cerr<<″aisequaltozero,error!″<<endl;//將有關(guān)出錯信息插入cerr流,在屏幕輸出
elseif((disc=b*b-4*a*c)<0)cerr<<″disc=b*b-4*a*c<0″<<endl;//將有關(guān)出錯信息插入cerr流,在屏幕輸出else{cout<<″x1=″<<(-b+sqrt(disc))/(2*a)<<endl;
cout<<″x2=″<<(-b-sqrt(disc))/(2*a)<<endl;}return0;}運行情況如下:①pleaseinputa,b,c:023↙aisequaltozero,error!②pleaseinputa,b,c:523↙sc=b*b-4*a*c<0③pleaseinputa,b,c:12.51.5↙x1=-1x2=-1.5在輸出數(shù)據(jù)時,有時希望數(shù)據(jù)按指定的格式輸出。有兩種方法可以達(dá)到此目的。一種是第3章已介紹過的使用控制符的方法;第2種是使用流對象的有關(guān)成員函數(shù)。1.使用控制符控制輸出格式輸出數(shù)據(jù)的控制符見書中表13.3。應(yīng)當(dāng)注意,這些控制符是在頭文件iomanip中定義的,因而程序中應(yīng)當(dāng)包含iomanip。13.2.2格式輸出例13.2用控制符控制輸出格式。#include<iostream>#include<iomanip>//不要忘記包含此頭文件usingnamespacestd;intmain(){inta;
cout<<″inputa:″;
cin>>a;
cout<<″dec:″<<dec<<a<<endl;//以十進(jìn)制形式輸出整數(shù)
cout<<″hex:″<<hex<<a<<endl;//以十六進(jìn)制形式輸出整數(shù)a
cout<<″oct:″<<setbase(8)<<a<<endl;//以八進(jìn)制形式輸出整數(shù)achar*pt=″China″;//pt指向字符串″China″
cout<<setw(10)<<pt<<endl;//指定域?qū)挒?0,輸出字符串
cout<<setfill(′*′)<<setw(10)<<pt<<endl;//指定域?qū)?0,輸出字符串,空白處以′*′填充
doublepi=22.0/7.0;//計算pi值
cout<<setiosflags(ios::scientific)<<setprecision(8);//按指數(shù)形式輸出,8位小數(shù)
cout<<″pi=″<<pi<<endl;//輸出pi值
cout<<″pi=″<<setprecision(4)<<pi<<endl;//改為4位小數(shù)
cout<<″pi=″<<setiosflags(ios::fixed)<<pi<<endl;//改為小數(shù)形式輸出
return0;}運行結(jié)果如下:inputa:34↙(輸入a的值)dec:34(十進(jìn)制形式)hex:22(十六進(jìn)制形式)oct:42(八進(jìn)制形式)China(域?qū)挒?0)*****China(域?qū)挒?0,空白處以′*′填充)pi=3.14285714e+00(指數(shù)形式輸出,8位小數(shù))pi=3.1429e+00(指數(shù)形式輸出,4位小數(shù))pi=3.143(小數(shù)形式輸出,精度仍為4)2.用流對象的成員函數(shù)控制輸出格式除了可以用控制符來控制輸出格式外,還可以通過調(diào)用流對象cout中用于控制輸出格式的成員函數(shù)來控制輸出格式。用于控制輸出格式的常用的成員函數(shù)見書中表13.4。流成員函數(shù)setf和控制符setiosflags括號中的參數(shù)表示格式狀態(tài),它是通過格式標(biāo)志來指定的。格式標(biāo)志在類ios中被定義為枚舉值。因此在引用這些格式標(biāo)志時要在前面加上類名ios和域運算符“::”。格式標(biāo)志見書中表13.5。例13.3用流控制成員函數(shù)輸出數(shù)據(jù)。#include<iostream>usingnamespacestd;intmain(){inta=21
cout.setf(ios::showbase);//顯示基數(shù)符號(0x或0)
cout<<″dec:″<<a<<endl;//默認(rèn)以十進(jìn)制形式輸出a
cout.unsetf(ios::dec);//終止十進(jìn)制的格式設(shè)置
cout.setf(ios::hex);//設(shè)置以十六進(jìn)制輸出的狀態(tài)
cout<<″hex:″<<a<<endl;//以十六進(jìn)制形式輸出acout.unsetf(ios::hex);//終止十六進(jìn)制的格式設(shè)置
cout.setf(ios::oct);//設(shè)置以八進(jìn)制輸出的狀態(tài)
cout<<″oct:″<<a<<endl;//以八進(jìn)制形式輸出acout.unseft(ios::oct);char*pt=″China″;//pt指向字符串″China″cout.width(10);//指定域?qū)挒?0
cout<<pt<<endl;//輸出字符串
cout.width(10);//指定域?qū)挒?0
cout.fill(′*′);//指定空白處以′*′填充
cout<<pt<<endl;//輸出字符串
doublepi=22.0/7.0;//輸出pi值cout.setf(ios::scientific);//指定用科學(xué)記數(shù)法輸出cout<<″pi=″;//輸出″pi=″cout.width(14);//指定域?qū)挒?4cout<<pi<<endl;//輸出pi值cout.unsetf(ios::scientific);//終止科學(xué)記數(shù)法狀態(tài)cout.setf(ios::fixed);//指定用定點形式輸出cout.width(12);//指定域?qū)挒?2cout.setf(ios::showpos);//正數(shù)輸出“+”號cout.setf(ios::internal);//數(shù)符出現(xiàn)在左側(cè)cout.precision(6);//保留6位小數(shù)cout<<pi<<endl;//輸出pi,注意數(shù)符“+”的位置return0;}運行情況如下:dec:21(十進(jìn)制形式)hex:0x15(十六進(jìn)制形式,以0x開頭)oct:025(八進(jìn)制形式,以0開頭)China(域?qū)挒?0)*****China(域?qū)挒?0,空白處以′*′填充)pi=**3.142857e+0(指數(shù)形式輸出,域?qū)?4,默認(rèn)6位小數(shù))+***3.142857(小數(shù)形式輸出,精度為6,最左側(cè)輸出數(shù)符“+”)輸出單個字符的成員函數(shù)put。如:cout.put(′a′);
調(diào)用該函數(shù)的結(jié)果是在屏幕上顯示一個字符a。put函數(shù)的參數(shù)可以是字符put函數(shù)的參數(shù)可以是字符的ASCII代碼put函數(shù)的參數(shù)也可以是一個整型表達(dá)式如:cout.put(65+32);輸出為:a(字符a的ASCII代碼)可以在一個語句中連續(xù)調(diào)用put函數(shù)。如:cout.put(71).put(79).pu(79).put(68).put(′\n′);
在屏幕上顯示GOOD。13.2.3用流成員函數(shù)put輸出字符例13.4有一個字符串″BASIC″,要求把它們按相反的順序輸出。#include<iostream>usingnamespacestd;intmain(){char*a=″BASIC″;//字符指針指向′B′
for(inti=4;i>=0;i--)
cout.put(*(a+i));//從最后一個字符開始輸出
cout.put(′\n′);return0;}運行時在屏幕上輸出:CISAB還可以用putchar函數(shù)輸出一個字符。putchar函數(shù)是C語言中使用的,在stdio.h頭文件中定義。C++保留了這個函數(shù),在iostream頭文件中定義。例13.4也可以改用putchar函數(shù)實現(xiàn)。#include<iostream>//也可以用#include<stdio.h>,同時不要下一行usingnamespacestd;intmain(){char*a=″BASIC″;
for(inti=4;i>=0;i--)
putchar(*(a+i));
putchar(′\n′);}運行結(jié)果與前相同。
cin是istream類的對象,它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)獲取數(shù)據(jù),程序中的變量通過流提取符“>>”從流中提取數(shù)據(jù)。注意:流提取符“>>”從流中提取數(shù)據(jù)時通常跳過輸入流中的空格、tab鍵、換行符等空白字符。遇到這些字符,該行數(shù)據(jù)輸入結(jié)束。即只有在輸入完數(shù)據(jù)再按回車鍵后,該行數(shù)據(jù)才被送入鍵盤緩沖區(qū),形成輸入流,提取運算符“>>”才能從中提取數(shù)據(jù)。13.3標(biāo)準(zhǔn)輸入流
13.3.1cin流1.用get函數(shù)讀入一個字符流成員函數(shù)get有3種形式:無參數(shù)的,有一個參數(shù)的,有3個參數(shù)的。(1)不帶參數(shù)的get函數(shù)其調(diào)用形式為:cin.get()用來從指定的輸入流中提取一個字符,函數(shù)的返回值就是讀入的字符。若遇到輸入流中的文件結(jié)束符,則函數(shù)值返回文件結(jié)束標(biāo)志EOF(EndOfFile)。13.3.2用于字符輸入的流成員函數(shù)舉例有3個參數(shù)的get函數(shù)其調(diào)用形式為cin.get(字符數(shù)組,字符個數(shù)n,終止字符)或cin.get(字符指針,字符個數(shù)n,終止字符)其作用是從輸入流中讀取n-1個字符,賦給指定的字符數(shù)組(或字符指針指向的數(shù)組),如果在讀取n-1個字符之前遇到指定的終止字符,則提前結(jié)束讀取。如果讀取成功則函數(shù)返回非0值(真),如失敗(遇文件結(jié)束符)則函數(shù)返回0值(假)。#include<iostream>usingnamespacestd;intmain(){charch[20];
cout<<″enterasentence:″<<endl;cin.get(ch,10,′\n′);//指定換行符為終止字符
cout<<ch<<endl;return0;}運行情況如下:enterasentence:IstudyC++veryhard.↙IstudyCget函數(shù)中第3個參數(shù)可以省寫,此時默認(rèn)為′\n′。終止字符也可以用其他字符。2.用成員函數(shù)getline函數(shù)讀入一行字符getline函數(shù)的作用是從輸入流中讀取一行字符,其用法與帶3個參數(shù)的get函數(shù)類似。即cin.getline(字符數(shù)組(或字符指針),字符個數(shù)n,終止標(biāo)志字符)例13.7用getline函數(shù)讀入一行字符。#include<iostream>usingnamespacestd;intmain(){charch[20];
cout<<″enterasentence:″<<endl;
cin>>ch;
cout<<″Thestringreadwithcinis:″<<ch<<endl;cin.getline(ch,20,′/′);//讀19個字符或遇′/′結(jié)束
cout<<″Thesecondpartis:″<<ch<<endl;cin.getline(ch,20);//讀19個字符或遇′/n′結(jié)束
cout<<″Thethirdpartis:″<<ch<<endl;return0;}程序運行情況如下:enterasentence:IlikeC++./IstudyC++./Iamhappy.↙Thestringreadwithcinis:IThesecondpartis:likeC++.Thethirdpartis:IstudyC++./Iamh除了以上介紹的用于讀取數(shù)據(jù)的成員函數(shù)外,istream類還有其他在輸入數(shù)據(jù)時用得著的一些成員函數(shù)。常用的有以下幾種:1.eof
函數(shù)eof是endoffile的縮寫,表示“文件結(jié)束”。從輸入流讀取數(shù)據(jù),如果到達(dá)文件末尾(遇文件結(jié)束符),eof函數(shù)值為非零值(表示真),否則為0(假)。13.3.3istream類的其他成員函數(shù)例13.8逐個讀入一行字符,將其中的非空格字符輸出。#include<iostream>usingnamespacestd;intmain(){charc;
while(!cin.eof())//eof()為假表示未遇到文件結(jié)束符if((c=cin.get())!=′′)//檢查讀入的字符是否為空格字符
cout.put(c);return0;}運行情況如下:C++isveryinteresting.↙C++isveryinteresting.^Z(結(jié)束)2.peek函數(shù)peek是“觀察”的意思,peek函數(shù)的作用是觀測下一個字符。其調(diào)用形式為:c=cin.peek();cin.peek()函數(shù)的返回值是指針指向的當(dāng)前字符,但它只是觀測,指針仍停留在當(dāng)前位置,并不后移。如果要訪問的字符是文件結(jié)束符,則函數(shù)值是EOF(-1)。3.putback函數(shù)其調(diào)用形式為:cin.putback(ch);其作用是將前面用get或getline函數(shù)從輸入流中讀取的字符ch返回到輸入流,插入到當(dāng)前指針位置,以供后面讀取。例13.9peek函數(shù)和putback函數(shù)的用法。#include<iostream>usingnamespacestd;intmain(){charc[20];
int
ch;
cout<<″pleaseenterasentence:″<<endl;cin.getline(c,15,′/′);
cout<<″Thefirstpartis:″<<c<<endl;ch=cin.peek();//觀看當(dāng)前字符
cout<<″Thenextcharacter(ASCIIcode)is:″<<ch<<endl;cin.putback(c[0]);//將′I′插入到指針?biāo)柑?/p>
cin.getline(c,15,′/′);
cout<<″Thesecondpartis:″<<c<<endl;return0;}運行情況如下:pleaseenterasentence:Iamaboy./amastudent./↙Thefirstpartis:Iamaboy.Thenextcharacter(ASCIIcode)is:32(下一個字符是空格)Thesecondpartis:Iamastudent
圖13.44.ignore函數(shù)其調(diào)用形式為:cin,ignore(n,終止字符)函數(shù)作用是跳過輸入流中n個字符,或在遇到指定的終止字符時提前結(jié)束(此時跳過包括終止字符在內(nèi)的若干字符)。如ighore(5,′A′)//跳過輸入流中5個字符,遇′A′后就不再跳了。也可以不帶參數(shù)或只帶一個參數(shù)。如:ignore()(n默認(rèn)值為1,終止字符默認(rèn)為EOF)相當(dāng)于:ignore(1,EOF)例13.10用ignore函數(shù)跳過輸入流中的字符。希望第二個cin.get函數(shù)能讀取″IstudyC++.″,就應(yīng)該設(shè)法跳過輸入流中第一個′/′,可以用ignore函數(shù)來實現(xiàn)此目的,將程序改為#include<iostream>usingnamespacestd;intmain(){charch[20];cin.get(ch,20,′/′);
cout<<″Thefirstpartis:″<<ch<<endl;
cin.ignore();//跳過輸入流中一個字符
cin.get(ch,20,′/′);
cout<<″Thesecondpartis:″<<ch<<endl;return0;}運行結(jié)果如下:IlikeC++./IstudyC++./Iamhappy.↙Thefirstpartis:IlikeC++.Thesecondpartis:IstudyC++. 前面我們討論的輸入輸出是以系統(tǒng)指定的標(biāo)準(zhǔn)設(shè)備(輸入設(shè)備為鍵盤,輸出設(shè)備為顯示器)為對象的。在實際應(yīng)用中,常以磁盤文件作為對象。即從磁盤文件讀取數(shù)據(jù),將數(shù)據(jù)輸出到磁盤文件。 所謂“文件”,一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合。一批數(shù)據(jù)是以文件的形式存放在外部介質(zhì)上的。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理的。要向外部介質(zhì)上存儲數(shù)據(jù)也必須先建立一個文件(以文件名標(biāo)識),才能向它輸出數(shù)據(jù)。13.4文件操作與文件流
13.4.1文件的概念外存文件包括磁盤文件、光盤文件和U盤文件。目前使用最廣泛的是磁盤文件。對用戶來說,常用到的文件有兩大類,一類是程序文件(programfile)。一類是數(shù)據(jù)文件(datafile)。程序中的輸入和輸出的對象就是數(shù)據(jù)文件。根據(jù)文件中數(shù)據(jù)的組織形式,可分為ASCII文件和二進(jìn)制文件。對于字符信息,在內(nèi)存中是以ASCII代碼形式存放的,因此,無論用ASCII文件輸出還是用二進(jìn)制文件輸出,其數(shù)據(jù)形式是一樣的。但是對于數(shù)值數(shù)據(jù),二者是不同的。例如:有一個長整數(shù),在內(nèi)存中占4個字節(jié),如果按內(nèi)部格式直接輸出,在磁盤文件中占4個字節(jié),如果將它轉(zhuǎn)換為ASCII碼形式輸出,則要占6個字節(jié),見圖13.5。文件流是以外存文件為輸入輸出對象的數(shù)據(jù)流。輸出文件流是從內(nèi)存流向外存文件的數(shù)據(jù),輸入文件流是從外存文件流向內(nèi)存的數(shù)據(jù)。每一個文件流都有一個內(nèi)存緩沖區(qū)與之對應(yīng)。請區(qū)分文件流與文件的概念。文件是存儲在外部介質(zhì)上數(shù)據(jù)的集合;文件流只是以文件為輸入輸出對象的流。若要對磁盤文件輸入輸出,就必須通過文件流來實現(xiàn)。有3個用于文件操作的文件類:(1)ifstream類,它是從istream類派生的。用來支持從磁盤文件的輸入。(2)ofstream類,它是從ostream類派生的。用來支持向磁盤文件的輸出。(3)fstream類,它是從iostream類派生的。用來支持對磁盤文件的輸入輸出。13.4.2文件流類與文件流對象要以磁盤文件為對象進(jìn)行輸入輸出,必須定義一個文件流類的對象,通過文件流對象將數(shù)據(jù)從內(nèi)存輸出到磁盤文件,或者通過文件流對象從磁盤文件將數(shù)據(jù)輸入到內(nèi)存。在用磁盤文件時,由于情況各異,無法事先統(tǒng)一定義,必須由用戶自己定義??梢杂孟旅娴姆椒ń⒁粋€輸出文件流對象:ofstream
outfile;
現(xiàn)在雖然建立了一個輸出文件流對象,但是還未指定它向哪一個磁盤文件輸出,需要在使用時加以指定。1.打開磁盤文件打開文件是指在文件讀寫之前做必要的準(zhǔn)備工作,包括:(1)為文件流對象和指定的磁盤文件建立關(guān)聯(lián),以便使文件流流向指定的磁盤文件。(2)指定文件的工作方式。以上工作可以通過兩種不同的方法實現(xiàn)。調(diào)用文件流的成員函數(shù)open。如:ofstream
outfile;//定義ofstream類(輸出文件流類)對象outfileoutfile.open(″f1.dat″,ios::out);//使文件流與f1.dat文件建立關(guān)聯(lián)調(diào)用成員函數(shù)open的一般形式為:文件流對象.open(磁盤文件名,輸入輸出方式);磁盤文件名可以包括路徑,如″c:\new\f1.dat″,如缺省路徑,則默認(rèn)為當(dāng)前目錄下的文件。13.4.3文件的打開與關(guān)閉在定義文件流對象時指定參數(shù)如:ofstreamoutfile(″f1.dat″,ios::out);在聲明文件流類時定義了帶參數(shù)的構(gòu)造函數(shù),其中包含了打開磁盤文件的功能。因此,可以在定義文件流對象時指定參數(shù),調(diào)用文件流類的構(gòu)造函數(shù)來實現(xiàn)打開文件的功能。一般多用此形式,比較方便。說明:每一個打開的文件都有一個文件指針??梢杂谩拔换颉边\算符“|”對輸入輸出方式進(jìn)行組合。如果打開操作失敗,open函數(shù)的返回值為0(假),如果是用調(diào)用構(gòu)造函數(shù)的方式打開文件的,則流對象的值為0。2.關(guān)閉磁盤文件在對已打開的磁盤文件的讀寫操作完成后,應(yīng)關(guān)閉該文件。關(guān)閉文件用成員函數(shù)close。如:outfile.close();//將輸出文件流所關(guān)聯(lián)的磁盤文件關(guān)閉操作完成后,必須解除該磁盤文件與文件流的關(guān)聯(lián),原來設(shè)置的工作方式也失效,這樣保存的數(shù)據(jù)才安全。Open()屬性列表:
ios::in
讀
ios::out
寫
ios::app
從文件末尾開始寫
ios::binary
二進(jìn)制模式
ios::nocreate
打開一個文件時,如果文件不存在,不創(chuàng)建文件。
ios::noreplace
打開一個文件時,如果文件不存在,創(chuàng)建該文件
ios::trunc
打開一個文件,然后清空內(nèi)容
ios::ate
打開一個文件時,將位置移動到文件尾默認(rèn)模式是文本默認(rèn)如果文件不存在,那么創(chuàng)建一個新的多種模式可以混合,用|(按位或)文件指針位置在c++中的用法:
ios::beg
文件頭
ios::end
文件尾
ios::cur
當(dāng)前位置ifstream流對象是以in模式打開ofstream流關(guān)聯(lián)的文件則以out模式打開fstream對象以in和out方式打開文件打開打開輸入文件:ifstreaminfile;infile.open(“file1”);或infile.open(“file1”,ifstream::in);也可以利用構(gòu)造函數(shù)直接打開:ifstreaminfile(“file1”);或ifstreaminfile(“file1”,ifstream::in);打開輸出文件ofstreamoutfile;outfile.open(“file2”);或outfile.open(“file2”,ofstream::out);也可以利用構(gòu)造函數(shù)直接打開:ofstreamoutfile(“file2”);或ofstreamoutfile(“file2”,ofstream::out);打開輸入輸出文件fstreamiofile(“file3”);fstreamiofile(“file3”,fstream::in|fstream::out);例13.11有一個整型數(shù)組,含10個元素,從鍵盤輸入10個整數(shù)給數(shù)組,將此數(shù)組送到磁盤文件中存放。#include<fstream>usingnamespacestd;intmain(){inta[10];
ofstreamoutfile(″f1.dat″,ios::out);//定義文件流對象,打開磁盤文件″f1.dat″
if(!outfile)//如果打開失敗,outfile返回0值
{cerr<<″openerror!″<<endl;exit(1);}
cout<<″enter10integernumbers:″<<endl;
for(inti=0;i<10;i++){cin>>a[i];
outfile<<a[i]<<″″;}//向磁盤文件″f1.dat″輸出數(shù)據(jù)
outfile.close();//關(guān)閉磁盤文件″f1.dat″return0;}//運行情況如下:enter10integernumbers:
ifstreaminfile(″f1.dat″,ios::in|ios::nocreate);//定義輸入文件流對象,以輸入方式打開磁盤文件f1.dat
if(!infile){cerr<<″openerror!″<<endl;exit(1);}for(i=0;i<10;i++){infile>>a[i];//從磁盤文件讀入10個整數(shù),順序存放在a數(shù)組中
cout<<a[i]<<″″;}//在顯示器上順序顯示10個數(shù)
cout<<endl;
max=a[0];order=0;for(i=1;i<10;i++)if(a[i]>max){max=a[i];//將當(dāng)前最大值放在max中
order=i;//將當(dāng)前最大值的元素序號放在order中
}
cout<<″max=″<<max<<endl<<″order=″<<order<<endl;
infile.close();return0;}運行情況如下在磁盤文件中存放的10個數(shù))max=10(最大值為10)order=6(最大值是數(shù)組中序號為6的元素)包含各種類型數(shù)據(jù)的文件操作#include<fstream>#include<iostream>usingnamespacestd;intmain(){ofstream
fout("test");if(!fout){cerr<<"cannotopenoutputfile\n";return1;}
fout<<10<<""<<123.456<<"\"Thisisatextfile\"\n";
fout.close();return0;}#include<fstream>#include<iostream>usingnamespacestd;intmain(){ifstream
fin("test.txt");chars[80];inti;floatx;if(!fin){cout<<"cannotopeninputfile\n";return1;}fin>>i>>x>>s;
cout<<i<<""<<x<<s<<endl;
fin.close();
fin.open(“test.txt");
cout<<"\nUsing
getlinefunction:"<<endl; fin>>i>>x;
fin.getline(s,80,'\n');// fin.get(s,80,'\0');
cout<<i<<""<<x<<s<<endl;
fin.close();return0;}讀文件10123.456"ThisUsinggetlinefunction:10123.456"Thisisatextfile"如果文件的每一個字節(jié)中均以ASCII代碼形式存放數(shù)據(jù),即一個字節(jié)存放一個字符,這個文件就是ASCII文件(或稱字符文件)。程序可以從ASCII文件中讀入若干個字符,也可以向它輸出一些字符。對ASCII文件的讀寫操作可以用以下兩種方法:(1)用流插入運算符“<<”和流提取運算符“>>”輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù)。(2)用本章介紹的文件流的put,get,geiline等成員函數(shù)進(jìn)行字符的輸入輸出。13.4.4對ASCII文件的操作例13.13從鍵盤讀入一行字符,把其中的字母字符依次存放在磁盤文件f2.dat中。再把它從磁盤文件讀入程序,將其中的小寫字母改為大寫字母,再存入磁盤文件f3.dat。#include<fstream>usingnamespacestd;//save_to_file函數(shù)從鍵盤讀入一行字符,并將其中的字母存入磁盤文件voidsave_to_file(){ofstreamoutfile(″f2.dat″);//定義輸出文件流對象outfile,以輸出方式打開磁盤文件f2.datif(!outfile){cerr<<″openf2.daterror!″<<endl;exit(1);}charc[80];cin.getline(c,80);//從鍵盤讀入一行字符
for(inti=0;c[i]!=0;i++)//對字符逐個處理,直到遇′/0′為止
if(c[i]>=65&&c[i]<=90||c[i]>=97&&c[i]<=122)//如果是字母字符{outfile.put(c[i]);//將字母字符存入磁盤文件f2.dat
cout<<c[i];}//同時送顯示器顯示
cout<<endl;
outfile.close();//關(guān)閉f2.dat}//從磁盤文件f2.dat讀入字母字符,將其中的小寫字母改為大寫字母,再存入f3.datvoidget_from_file(){charch;
ifstreaminfile(″f2.dat″,ios::in|ios::nocreate);//定義輸入文件流outfile,以輸入方式打開磁盤文件f2.dat
if(!infile){cerr<<″openf2.daterror!″<<endl;exit(1);}
ofstreamoutfile(″f3.dat″);//定義輸出文件流outfile,以輸出方式打開磁盤文件f3.dat
if(!outfile){cerr<<″openf3.daterror!″<<endl;exit(1);}while(infile.get(ch))//當(dāng)讀取字符成功時執(zhí)行下面的復(fù)合語句
{if(ch>=97&&ch<=122)//判斷ch是否為小寫字母
ch=ch-32;//將小寫字母變?yōu)榇髮懽帜?/p>
outfile.put(ch);//將該大寫字母存入磁盤文件f3.dat
cout<<ch;//同時在顯示器輸出
}cout<<endl;infile.close();//關(guān)閉磁盤文件f2.datoutfile.close();//關(guān)閉磁盤文件f3.dat}intmain(){save_to_file();//調(diào)用save_to_file(),從鍵盤讀入一行字符并將其中的字母存入磁盤文件f2.datget_from_file();//調(diào)用get_from_file(),從f2.dat讀入字母字符,改為大寫字母,再存入f3.datreturn0;}//運行情況如下:NewBeijing,GreatOlypic,2008,China.↙NewBeijingGreatOlypicChina(將字母寫入磁盤文件f2.dat,同時在屏幕顯示)NEWBEIJINGGREATOLYPICCHINA(改為大寫字母)13.14編一程序?qū)⒋疟P文件內(nèi)容讀入內(nèi)存,然后輸出到顯示器。可以編一個專用函數(shù)。#include<fstream>usingnamespacestd;voiddisplay_file(char*filename){ifstream
infile(filename,ios::in);
if(!infile){cerr<<″openerror!″<<endl;exit(1);}charch;
while(infile.get(ch))
cout.put(ch);
cout<<endl;
infile.close();}intmain(){display_file(″f3.dat″);//將f3.dat的入口地址傳給形參filenamereturn0;}//運行時輸出f3.dat中的字符二進(jìn)制文件不是以ASCII代碼存放數(shù)據(jù)的,它將內(nèi)存中數(shù)據(jù)存儲形式不加轉(zhuǎn)換地傳送到磁盤文件,因此它又稱為內(nèi)存數(shù)據(jù)的映像文件。因為文件中的信息不是字符數(shù)據(jù),而是字節(jié)中的二進(jìn)制形式的信息,因此它又稱為字節(jié)文件。對二進(jìn)制文件的操作也需要先打開文件,用完后要關(guān)閉文件。在打開時要用ios::binary指定為以二進(jìn)制形式傳送和存儲。二進(jìn)制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件。13.4.5對二進(jìn)制文件的操作1.用成員函數(shù)read和write讀寫二進(jìn)制文件對二進(jìn)制文件的讀寫主要用istream類的成員函數(shù)read和ostream類的成員函數(shù)write來實現(xiàn)。這兩個成員函數(shù)的原型為:istream&read(char*buffer,int
len);ostream&write(constchar*buffer,int
len);字符指針buffer指向內(nèi)存中一段存儲空間。len是讀寫的字節(jié)數(shù)。調(diào)用的方式為a.write(p1,50);b.read(p2,30);例13.14將一批數(shù)據(jù)以二進(jìn)制形式存放在磁盤文件中。#include<fstream>usingnamespacestd;structstudent{charname[20];
intnum;
intage;charsex;};intmain(){studentstud[3]={″Li″,1001,18,′f′,″Fun″,1002,19,′m′,″Wang″,1004,17,′f′};
ofstream
outfile(″stud.dat″,ios::binary);
if(!outfile){cerr<<″openerror!″<<endl;abort();//退出程序
}
for(inti=0;i<3;i++)
outfile.write((char*)&stud[i],sizeof(stud[i]));
outfile.close();return0;}其實可以一次輸出結(jié)構(gòu)體數(shù)組的3個元素,將for循環(huán)的兩行改為以下一行:outfile.write((char*)&stud[0],sizeof(stud));執(zhí)行一次write函數(shù)即輸出了結(jié)構(gòu)體數(shù)組的全部數(shù)據(jù)??梢钥吹剑眠@種方法一次可以輸出一批數(shù)據(jù),效率較高。在輸出的數(shù)據(jù)之間不必加入空格,在一次輸出之后也不必加回車換行符。在以后從該文件讀入數(shù)據(jù)時不是靠空格作為數(shù)據(jù)的間隔,而是用字節(jié)數(shù)來控制。例13.15將剛才以二進(jìn)制形式存放在磁盤文件中的數(shù)據(jù)讀入內(nèi)存并在顯示器上顯示。#include<fstream>usingnamespacestd;structstudent{stringname;
intnum;
intage;charsex;};intmain(){studentstud[3];
inti;
ifstream
infile(″stud.dat″,ios::binary);
if(!infile){cerr<<″openerror!″<<endl;abort();}
for(i=0;i<3;i++)
infile.read((char*)&stud[i],sizeof(stud[i]));
infile.close();for(i=0;i<3;i++){cout<<″NO.″<<i+1<<endl;
cout<<″name:″<<stud[i].name<<endl;
cout<<″num:″<<stud[i].num<<endl;;
cout<<″age:″<<stud[i].age<<endl;
cout<<″sex:″<<stud[i].sex<<endl<<endl;}return0;}運行時在顯示器上顯示:NO.1name:Linum:1001age:18sex:fNO.2name:Funnum:1001age:19sex:mNO.3name:Wangnum:1004age:17sex:f請思考:能否一次讀入文件中的全部數(shù)據(jù),如infile.read((char*)&stud[0],sizeof(stud));2.與文件指針有關(guān)的流成員函數(shù)在磁盤文件中有一個文件指針,用來指明當(dāng)前應(yīng)進(jìn)行讀寫的位置。對于二進(jìn)制文件,允許對指針進(jìn)行控制,使它按用戶的意圖移動到所需的位置,以便在該位置上進(jìn)行讀寫。文件流提供一些有關(guān)文件指針的成員函數(shù)。為了查閱方便,將它們歸納為書中表13.7,并作必要的說明。ios::beg文件開頭(beg是begin的縮寫),這是默認(rèn)值。ios::cur指針當(dāng)前的位置(cur是current的縮寫)。ios::end文件末尾。它們是在ios類中定義的枚舉常量。舉例如下:infile.seekg(100);//輸入文件中的指針向前移到100字節(jié)位置infile.seekg(-50,ios::cur);//輸入文件中的指針從當(dāng)前位置后移50字節(jié)outfile.seekp(-75,ios::end);//輸出文件中的指針從文件尾后移50字節(jié)3.隨機(jī)訪問二進(jìn)制數(shù)據(jù)文件一般情況下讀寫是順序進(jìn)行的,即逐個字節(jié)進(jìn)行讀寫。但是對于二進(jìn)制數(shù)據(jù)文件來說,可以利用上面的成員函數(shù)移動指針,隨機(jī)地訪問文件中任一位置上的數(shù)據(jù),還可以修改文件中的內(nèi)容。可寫出以下程序:#include<fstream>usingnamespacestd;structstudent{intnum;charname[20];floatscore;};intmain(){studentstud[5]={1001,″Li″,85,1002,″Fun″,97.5,1004,″Wang″,54,1006,″Tan″,76.5,1010,″ling″,96};
fstream
iofile(″stud.dat″,ios::in|ios::out|ios::binary);//用fstream類定義輸入輸出二進(jìn)制文件流對象iofile
if(!iofile){cerr<<″openerror!″<<endl;abort();}
for(inti=0;i<5;i++)//向磁盤文件輸出5個學(xué)生的數(shù)據(jù)
iofile.write((char*)&stud[i],sizeof(stud[i]));studentstud1[5];//用來存放從磁盤文件讀入的數(shù)據(jù)
for(inti=0;i<5;i=i+2){iofile.seekg(i*sizeof(stud[i]),ios::beg);//定位于第0,2,4學(xué)生數(shù)據(jù)開頭
iofile.read((char*)&stud1[i/2],sizeof(stud1[0]));//先后讀入3個學(xué)生的數(shù)據(jù),存放在stud1[0],stud[1]和stud[2]中
cout<<stud1[i/2].num<<″″<<stud1[i/2].name<<″″<<stud1[i/2].score<<endl;}//輸出stud1[0],stud[1]和stud[2]各成員的值cout<<endl;stud[2].num=1012;//修改第3個學(xué)生(序號為2)的數(shù)據(jù)
strcpy(stud[2].name,″Wu″);stud[2].score=60;iofile.seekp(2*sizeof(stud[0]),ios::beg);//定位于第3個學(xué)生數(shù)據(jù)的開頭
iofile.write((char*)&stud[2],sizeof(stud[2]));//更新第3個學(xué)生數(shù)據(jù)
iofile.seekg(0,ios::beg);//重新定位于文件開頭
for(inti=0;i<5;i++){iofile.read((char*)&stud[i],sizeof(stud[i]));//讀入5個學(xué)生的數(shù)據(jù)
cout<<stud[i].num<<″″<<stud[i].name<<″″<<stud[i].score<<endl;}
iofile.close();return0;}//運行情況如下:1001Li85(第1個學(xué)生數(shù)據(jù))1004Wang54(第3個學(xué)生數(shù)據(jù))1010ling96(第5個學(xué)生數(shù)據(jù))1001Li85(輸出修改后5個學(xué)生數(shù)據(jù))1002Fun97.51012Wu60(已修改的第3個學(xué)生數(shù)據(jù))1006Tan76.51010ling96文件流是以外存文件為輸入輸出對象的數(shù)據(jù)流,字符串流以內(nèi)存中用戶定義的字符數(shù)組(字符串)為輸入輸出的對象,即將數(shù)據(jù)輸出到內(nèi)存中的字符數(shù)組,或者從字符數(shù)組(字符串)將數(shù)據(jù)讀入。字符串流也稱為內(nèi)存流。字符串流也有相應(yīng)的緩沖區(qū),開始時流緩沖區(qū)是空的。如果向字符數(shù)組存入數(shù)據(jù),隨著向流插入數(shù)據(jù),流緩沖區(qū)中的數(shù)據(jù)不斷增加,待緩沖區(qū)滿了(或遇換行符),一起存入字符數(shù)組。如果是從字符數(shù)組讀數(shù)據(jù),先將字符數(shù)組中的數(shù)據(jù)送到流緩沖區(qū),然后從緩沖區(qū)中提取數(shù)據(jù)賦給有關(guān)變量。13.5字符串流在字符數(shù)組中可以存放字符,也可以存放整數(shù)、浮點數(shù)以及其他類型的數(shù)據(jù)。在向字符數(shù)組存入數(shù)據(jù)之前,要先將數(shù)據(jù)從二進(jìn)制形式轉(zhuǎn)換為ASCII代碼,然后存放在緩沖區(qū),再從緩沖區(qū)送到字符數(shù)組。從字符數(shù)組讀數(shù)據(jù)時,先將字符數(shù)組中的數(shù)據(jù)送到緩沖區(qū),在賦給變量前要先將ASCII代碼轉(zhuǎn)換為二進(jìn)制形式??傊骶彌_區(qū)中的數(shù)據(jù)格式與字符數(shù)組相同。字符串流類有istrstream,ostrstream和strstream。文件流類和字符串流類都是ostream,istream和iostream類的派生類,因此對它們的操作方法是基本相同的。1.建立輸出字符串流對象ostrstream類提供的構(gòu)造函數(shù)的原型為ostrstream::ostrstream(char*buffer,int
n,intmode=ios::out);buffer是指向字符數(shù)組首元素的指針,n為指定的流緩沖區(qū)的大小(一般選與字符數(shù)組的大小相同),第3個參數(shù)是可選的,默認(rèn)為ios::out方式??梢杂靡韵抡Z句建立輸出字符串流對象并與字符數(shù)組建立關(guān)聯(lián):ostrstreamstrout(ch1,20);作用是建立輸出字符串流對象strout,并使strout與字符數(shù)組ch1關(guān)聯(lián)(通過字符串流將數(shù)據(jù)輸出到字符數(shù)組ch1),流緩沖區(qū)大小為20。2.建立輸入字符串流對象istrstream類提供了兩個帶參的構(gòu)造函數(shù),原型為istrstream::istrstream(char*buffer);istrstream::istrstream(char*buffer,intn);buffer是指向字符數(shù)組首元素的指針,用它來初始化流對象(使流對象與字符數(shù)組建立關(guān)聯(lián))??梢杂靡韵抡Z句建立輸入字符串流對象:istrstreamstrin(ch2);作用是建立輸入字符串流對象strin,將字符數(shù)組ch2中的全部數(shù)據(jù)作為輸入字符串流的內(nèi)容。istrstreamstrin(ch2,20);流緩沖區(qū)大小為20,因此只將字符數(shù)組ch2中的前20個字符作為輸入字符串流的內(nèi)容。二進(jìn)制文件不是以ASCII代碼存放數(shù)據(jù)的,它將內(nèi)存中數(shù)據(jù)存儲形式不加轉(zhuǎn)換地傳送到磁盤文件,因此它又稱為內(nèi)存數(shù)據(jù)的映像文件。因為文件中的信息不是字符數(shù)據(jù),而是字節(jié)中的二進(jìn)制形式的信息,因此它又稱為字節(jié)文件。對二進(jìn)制文件的操作也需要先打開文件,用完后要關(guān)閉文件。在打開時要用ios::binary指定為以二進(jìn)制形式傳送和存儲。二進(jìn)制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件。13.4.5對二進(jìn)制文件的操作1.用成員函數(shù)read和write讀寫二進(jìn)制文件對二進(jìn)制文件的讀寫主要用istream類的成員函數(shù)read和ostream類的成員函數(shù)write來實現(xiàn)。這兩個成員函數(shù)的原型為:istream&read(char*buffer,int
len);ostream&write(constchar*buffer,int
len);字符指針buffer指向內(nèi)存中一段存儲空間。len是讀寫的字節(jié)數(shù)。調(diào)用的方式為a.write(p1,50);b.read(p2,30);例13.14將一批數(shù)據(jù)以二進(jìn)制形式存放在磁盤文件中。#include<fstream>usingnamespacestd;structstudent{charname[20];
intnum;
intage;charsex;};intmain(){studentstud[3]={″Li″,1001,18,′f′,″Fun″,1002,19,′m′,″Wang″,1004,17,′f′};
ofstream
outfile(″stud.dat″,ios::binary);
if(!outfile){cerr<<″openerror!″<<endl;abort();//退出程序
}
for(inti=0;i<3;i++)
outfile.write((char*)&stud[i],sizeof(stud[i]));
outfile.close();return0;}其實可以一次輸出結(jié)構(gòu)體數(shù)組的3個元素,將for循環(huán)的兩行改為以下一行:outfile.write((char*)&stud[0],sizeof(stud));執(zhí)行一次write函數(shù)即輸出了結(jié)構(gòu)體數(shù)組的全部數(shù)據(jù)??梢钥吹?,用這種方法一次可以輸出一批數(shù)據(jù),效率較高。在輸出的數(shù)據(jù)之間不必加入空格,在一次輸出之后也不必加回車換行符。在以后從該文件讀入數(shù)據(jù)時不是靠空格作為數(shù)據(jù)的間隔,而是用字節(jié)數(shù)來控制。3.隨機(jī)訪問二進(jìn)制數(shù)據(jù)文件一般情況下讀寫是順序進(jìn)行的,即逐個字節(jié)進(jìn)行讀寫。但是對于二進(jìn)制數(shù)據(jù)文件來說,可以利用上面的成員函數(shù)移動指針,隨機(jī)地訪問文件中任一位置上的數(shù)據(jù),還可以修改文件中的內(nèi)容??蓪懗鲆韵鲁绦?#include<fstream>usingnamespacestd;structstudent{intnum;charname[20];floatscore;};文件流是以外存文件為輸入輸出對象的數(shù)據(jù)流,字符串流以內(nèi)存中用戶定義的字符數(shù)組(字符串)為
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人合伙經(jīng)營合同范本
- 中亞文化交流出版合同
- 貨物運輸承包合同模板
- 個人兼職勞動合同范本
- 二手注塑機(jī)轉(zhuǎn)讓合同
- 中外零部件裝配項目合同細(xì)則
- 上海市住宅保潔服務(wù)合同
- 專業(yè)保潔員勞動合同模板大全
- 二級建造師職業(yè)合同范本
- 東莞市合作協(xié)議合同樣本
- 社團(tuán)活動經(jīng)費預(yù)算申請表
- 經(jīng)營范圍登記規(guī)范表述目錄(試行)(V1.0.2版)
- 2023年山東省威海市中考物理真題(附答案詳解)
- 第八講 發(fā)展全過程人民民主PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 王崧舟:學(xué)習(xí)任務(wù)群與課堂教學(xué)變革 2022版新課程標(biāo)準(zhǔn)解讀解析資料 57
- 招投標(biāo)現(xiàn)場項目經(jīng)理答辯(完整版)資料
- 運動競賽學(xué)課件
- 重大事故隱患整改臺賬
- 2022年上海市初中畢業(yè)數(shù)學(xué)課程終結(jié)性評價指南
- 高考作文備考-議論文對比論證 課件14張
- 新華師大版七年級下冊初中數(shù)學(xué) 7.4 實踐與探索課時練(課后作業(yè)設(shè)計)
評論
0/150
提交評論