版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第9章輸入輸出流C++語言程序設(shè)計教程—大連理工大學(xué)軟件學(xué)院第9章輸入輸出流
大連理工大學(xué)軟件學(xué)院9.5字符串流9.6案例分析9.4文件流9.3流操作9.2標準流對象9.1理解IO流1.輸入輸出流2.流類與緩沖區(qū)3.使用流的優(yōu)點
1.標準輸入流對象2.標準輸出流對象1.格式化輸入輸出
2.字符數(shù)據(jù)的讀寫3.輸入輸出流的錯誤4.重載<<與>>1.文件流類與對象
2.文件打開與關(guān)閉
3.文本文件的讀寫4.文件的隨機讀寫
流(stream)表示信息從源到目的端的流動,負責建立數(shù)據(jù)生產(chǎn)者和消費者之間的聯(lián)系,數(shù)據(jù)按順序從一個對象傳送到另一對象?!瑿++中把數(shù)據(jù)之間的傳輸操作稱作”流”9.1理解流
I/O系統(tǒng)的任務(wù)就是在內(nèi)存和外部設(shè)備之間穩(wěn)定可靠地傳輸數(shù)據(jù)和解釋數(shù)據(jù)。程序中,對數(shù)據(jù)的輸入/輸出是以字節(jié)流實現(xiàn)的應(yīng)用程序?qū)ψ止?jié)序列作出各種數(shù)據(jù)解釋.為了實現(xiàn)數(shù)據(jù)的有效流動,C++提供了龐大的I/O類庫,包括:(1)標準I/O流
對系統(tǒng)指定的標準設(shè)備的I/O操作。(2)文件I/O流
以外存中的文件為對象進行輸入和輸出。
(3)字符串流
對內(nèi)存中指定空間進行輸入和輸出。
9.1.1I/O流9.1理解流
圖9.1
數(shù)據(jù)在輸入源、程序內(nèi)存與輸出端之間流動9.1理解流9.1理解流進行輸入時標準流對象cin負責建立輸入通道為數(shù)據(jù)開辟緩沖區(qū)緩沖區(qū)(buffer)一個臨時存儲區(qū),匹配不同設(shè)備數(shù)據(jù)傳輸率的差異C++類庫包括龐大的IO類族,這些流類提供了豐富成員函數(shù)和運算符實現(xiàn)輸入輸出操作
9.1理解流9.1.2流類與緩沖區(qū)9.1理解流9.1.2流類與緩沖區(qū)iostream類庫中不同類的聲明放在不同的頭文件中
iostream.h
包含操作所有輸入/輸出流所需的基本信息istream.h,ostream.h
iomanip.h
包含格式化I/O操縱算子,用于指定數(shù)據(jù)輸入輸出的格式
fstream.h
處理文件信息,包括建立文件,讀/寫文件的各種操作接口
C++程序可使用流對象cin與cout簡潔安全地進行I/O操作。自動識別類型輸出流類ostream中重載運算符“<<”,輸入流類istream中重載運算符“>>”,使cin與cout能夠識別對各種基本類型數(shù)據(jù),自動按照指定的格式完成輸入或者輸出操作??蓴U展性好對運算符“<<”和“>>”的重載,可以對各種用戶自定義類型數(shù)據(jù)進行簡潔安全的輸入輸出操作。9.1.3使用流的優(yōu)點9.1理解流
I/O流類庫預(yù)定義了一批流對象,連接常用的外部設(shè)備.
程序員可以定義所需的I/O流對象,使用流庫提供的工作方式實現(xiàn)數(shù)據(jù)傳輸。
istreamcinostreamcout輸入流對象____________________內(nèi)存____________________輸出流對象9.2標準流對象標準流對象是在std命名空間中定義的流對象,提供程序內(nèi)存與常用外部設(shè)備進行數(shù)據(jù)交互功能。9.2標準流對象9.2.1標準輸出流對象
標準流輸出對象是在std命名空間中定義的流對象,包括:externostreamcout;externostreamcerr;externostreamclog;
cout ostream類的對象(consoleoutput)
該對象將程序中的數(shù)據(jù)傳送到標準輸出設(shè)備上。通常將數(shù)據(jù)在屏幕上顯示出來。使用<<順序地將數(shù)據(jù)組裝成字節(jié)序列,插入到流中輸出。
ostream&ostream::operator<<(基本類型標識符);9.2標準流對象9.2.1標準輸出流對象輸出數(shù)據(jù)的類型?cerr與clog輸出流對象clog(consolelog)
cerr(consoleerror)作用相同:都能在標準輸出設(shè)備上顯示出錯信息,兩個對象一般關(guān)聯(lián)顯示器進行輸出。區(qū)別:cerr不經(jīng)過緩沖區(qū),直接向顯示器上輸出有關(guān)信息clog中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或接收endl時輸出。
9.2標準流對象9.2.1標準輸出流對象
cinistream類的對象,從標準輸入設(shè)備(鍵盤)獲取數(shù)據(jù),cin使用流提取符“>>”將字節(jié)流中的數(shù)據(jù)進行解析后傳輸給內(nèi)存。從字節(jié)流中抽取若干字節(jié)(遇到分隔符為止),按接收變量類型不同組裝數(shù)據(jù),即將字符型數(shù)據(jù)轉(zhuǎn)換成二進制形式存儲到變量中,使用這種流提取運算符輸入稱為格式化輸入
9.2標準流對象9.2.2標準輸入流對象9.2標準流對象9.2.2標準輸入流對象inti;charc;doubled;cin>>d>>c>>i;
cin在istream流類重載中>>的一組公用成員函數(shù)
istream&operator>>(基本類型標識符&);流提取符從流中提取數(shù)據(jù)時通常跳過輸入流中的空格、tab鍵、換行符等空白字符。只有在輸入完數(shù)據(jù)再按回車鍵后,該行數(shù)據(jù)才被送入鍵盤緩沖區(qū),形成輸入流,提取運算符才能從中提取數(shù)據(jù)。
9.2標準流對象9.2.2標準輸入流對象9.3流操作
1格式化輸入輸出
2字符數(shù)據(jù)的讀寫put()get()getline()
3輸入輸出流的錯誤good()bad()eof()clear()4重載operator<<operator>>9.3.1格式化輸入輸出9.3流操作
控制符作用dec轉(zhuǎn)換整數(shù)的基數(shù)為十進制oct轉(zhuǎn)換整數(shù)的基數(shù)為八進制hex轉(zhuǎn)換整數(shù)的基數(shù)為十六進制showbase在輸出中顯示基數(shù)指示符uppercase十六進制輸出時一律用大寫字母scientific科學(xué)記數(shù)法顯示浮點數(shù)fixed定點小數(shù)形式顯示浮點數(shù)showpoint把帶有小數(shù)點浮點數(shù)值輸入到流中showpos正整數(shù)前加“+”號unitbuf輸出操作后立即刷新流left輸出數(shù)據(jù)在本域?qū)挿秶鷥?nèi)左對齊right輸出數(shù)據(jù)在本域?qū)挿秶鷥?nèi)右對齊9.3.1格式化輸入輸出9.3流操作
在基類ios中定義了相關(guān)的控制符和成員函數(shù)在頭文件iomanip中還聲明了一些普通函數(shù)控制符成員函數(shù)作用setfill(charc)fill(charc)設(shè)置填充字符為字符常量或字符變量csetprecision(intn)precision(intn)設(shè)置顯示小數(shù)的精度為n位setw(intn)width(intn)設(shè)置域?qū)挒閚個字符setiosflags()setf()設(shè)置輸出格式的狀態(tài)resetiosflags()unsetf()清除已設(shè)置輸出格式9.3.2字符數(shù)據(jù)的讀寫9.3流操作
函數(shù)功能put無格式,插入一個字節(jié)write無格式,插入一字節(jié)序列flush刷新輸出流seekp移動輸出流指針tellp返回輸出流中指定位置的指針值operstor<<插入運算符ostream類的公有成員函數(shù)
ostream&ostream
::put(charch);該函數(shù)的功能是把一個字符寫入流中,在屏幕上顯示該字符。該函數(shù)的的參數(shù)可以是字符常量、字符變量或字符的ASCII代碼,也可以是一個整型表達式。
函數(shù)功能read無格式輸入指定字節(jié)數(shù)get從流中提取字符,包括空格getline從流中提取一行字符ignore提取并丟棄流中指定字符peek返回流中下一個字符,但不從流中刪除gcount統(tǒng)計最后輸入的字符個數(shù)eatwhite忽略前導(dǎo)空格seekg移動輸入流指針tellg返回輸入流中指定位置的指針值operstor>>提取運算符istream類的公有成員函數(shù)
intget();istream&get(char&rch);istream&get(char*pch,intnCount,chardelim='\n');istream&getline(char*pch,intnCount,chardelim='\n');
9.3流操作
字符輸入函數(shù)intistream::get();
9.3流操作
功能:
從流中讀取任意1個字符,返回值為讀入的字符??捎糜趶逆I盤讀取字符,也可從文件中讀取字符。如果輸入結(jié)束或達到文件末尾,該函數(shù)就返回字符EOF(EndofFile)while((c=cin.get())!=EOF)cout.put(c);//輸出字符字符輸入函數(shù)istream&istream::get(char&ch);
9.3流操作
功能:帶參數(shù)的get函數(shù)也能從流中讀取一個字符,所讀取的字符存儲在參數(shù)ch中。如果讀取字符不成功,設(shè)置錯誤標志并在ch中存儲EOF
while((c=cin.get())!=EOF)cout.put(c);//輸出字符while(cin.get(c))cout.put(c);while(cin>>c)cout<<c;字符串輸入函數(shù)istream&istream::get(char*&pArray,streamsizen,chardelim=‘\n’);9.3流操作
功能:從輸入流中讀取n-1個字符(通常為long型),賦給指定的字符數(shù)組pArray(或字符指針指向的數(shù)組),如果在讀取n-1個字符之前遇到指定的終止字符delim,則提前結(jié)束讀取。
cin.get(cArray,5);cin.get(cArray,5,'\n');cin.get(cArray,10,'.');字符串輸入函數(shù)istream&istream::get(char*&pArray,streamsizen,chardelim=‘\n’);9.3流操作
作用:讀取一段文本,并將輸入的字符串以及一個空字符一起存儲,將指定的終止符留在流中。如讀取失敗(遇EOF)則流istream對象設(shè)置錯誤標志,不能繼續(xù)進行輸入操作。charstr[20];cin>>str;cin.get(str,20);運行并分析輸出結(jié)果
charch1[20],ch2[20],ch3[20],ch4[20]; cin>>ch1;
cout<<ch1<<endl; cin.get(ch2,10);cout<<ch2<<endl;
cin.get(ch3,20);cout<<ch3<<endl;
cin.get(ch4,20,'.');cout<<ch4<<endl;\n9.3流操作
\n字符串輸入函數(shù)istream&istream::getline(char*&pArray,streamsizen,chardelim=‘\n’);9.3流操作
作用:從輸入流中讀取n-1個字符,賦給指定的字符數(shù)組,如果在讀取n-1個字符之前遇到指定的終止字符,則提前結(jié)束讀取。如果讀取成功則函數(shù)返回非0值(真),如失敗(遇文件結(jié)束符)則函數(shù)返回0值(假)。從流中提取字符串后流中刪除分隔符,繼續(xù)讀取的字符串從分隔符后面的字符開始。get()vs.getline()
運行ch9_5.cpp并分析輸出結(jié)果
charch1[20],ch2[20],ch3[20],ch4[20]; cin>>ch1;
cout<<ch1<<endl; cin.getline(ch2,10);cout<<ch2<<endl;
cin.getline(ch3,20);cout<<ch3<<endl;
cin.getline(ch4,20,'.');cout<<ch4<<endl;\n
9.3流操作
\n函數(shù)功能read無格式輸入指定字節(jié)數(shù)get從流中提取字符,包括空格getline從流中提取一行字符ignore提取并丟棄流中指定字符peek返回流中下一個字符,但不從流中刪除gcount統(tǒng)計最后輸入的字符個數(shù)eatwhite忽略前導(dǎo)空格seekg移動輸入流指針tellg返回輸入流中指定位置的指針值operstor>>提取運算符istream&ignore(intnCount=1,intdelim=EOF);函數(shù)ignore()可以跳過輸入流中的若干字符,或在遇到指定終止符時提前結(jié)束(跳出包括終止符在內(nèi)的n個字符)。
istream類的公有成員函數(shù)
9.3流操作
標識常量值意義ios::goodbit0x00狀態(tài)正常ios::eofbit0x01文件結(jié)束符,當文件結(jié)尾時設(shè)置該標志ios::failbit0x02I/O操作失敗,數(shù)據(jù)未丟失,可以恢復(fù)ios::badbit0x04非法操作,數(shù)據(jù)丟失,不可恢復(fù)00000000000000000000000000000001000000000000001000000000000001009.3.3輸入輸出流的錯誤為了保證程序能夠安全進行輸入輸出操作,C++提供了檢測I/O流狀態(tài)的標志和成員函數(shù)。在流類中包含一個描述流狀態(tài)的數(shù)據(jù)成員state,這個狀態(tài)字中特定位記錄流處于正常狀態(tài)或不同的錯誤狀態(tài)。
9.3流操作
流類提供一些成員函數(shù)用于測試或設(shè)置流對象的狀態(tài),常用函數(shù)
函數(shù)功能inteof()const;返回eofbit狀態(tài)值。文件結(jié)束符時返回1,否則返回0intfail()const;返回failbit狀態(tài)值intbad()const;返回badbit狀態(tài)intgood()const;eofbit、failbit和badbit都沒有被設(shè)置,則返回1intrdstate()const;返回狀態(tài)字voidclear(intn=0);恢復(fù)或設(shè)置狀態(tài)字9.3.3輸入輸出流的錯誤9.3流操作
C++中定義的位左移運算符“<<”和位右移的運算符“>>”進行位運算,在流類中對它們進行了重載,使之作為流插入運算符和流提取運算符,用來對各種基本類型的數(shù)據(jù)進行輸出和輸入操作。9.3.4重載流插入和提取運算符9.3流操作
重載流插入運算符<<ostream流類中為基本類型數(shù)據(jù)重載“<<”,有如下形式:ostream&ostream
::operator<<(int); ostream&ostream
::operator<<(float); ostream&ostream
::operator<<(char); ostream&ostream
::operator<<(constvoid*);ostream&ostream
::operator<<(constchar*);9.3.4重載流插入和提取運算符9.3流操作
可以在用戶自定義的類A中重載該運算符A類中定義如下友元函數(shù):friendostream&operator<<(ostream&out,constA&);
重載流提取運算符>>istream類中重載了一組成員函數(shù)operator>>(),對于各種基本類型T的數(shù)據(jù),定義成員函數(shù)重載該運算符:istream&istream::operator>>(T&data);istream&istream::operator>>(char*);9.3.4重載流插入和提取運算符9.3流操作
可以在用戶自定義的類A中重載>>運算符A類中定義如下友元函數(shù):friendistream&operator>>(istream&,Type&);
數(shù)據(jù)的層次結(jié)構(gòu)
Bit–Byte–Field–Record–File-DBMS
C++把文件看成有序的字節(jié)流,提供低級和高級的I/O功能一批數(shù)據(jù)通常是以文件的形式存放在外部介質(zhì)上的。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理。
文件的概念
存儲在外部介質(zhì)中的數(shù)據(jù)集合稱為文件.9.4文件流
知識要點
文件以及文件流的概念
數(shù)據(jù)流動方向,文本文件與二進制文件 文件流類與文件流對象文件的打開與關(guān)閉打開方式文本文件的順序讀寫操作
<<,>>,put,get(),getline(),read(),write()二進制文件的隨機讀寫操作9.4文件流
0123n-1------------------------內(nèi)存------------------------ifstreamfinfstreamfinoutofstreamfout讀文件寫文件讀/寫文件文件流的概念
文件流是以外存文件為輸入輸出對象的數(shù)據(jù)流
文件9.4文件流
9.4.1文件流類與對象9.4.1文件流類與對象文件流是以外存文件為輸入輸出對象的數(shù)據(jù)流。輸出文件流是從內(nèi)存流向外存文件的字節(jié)序列,輸入文件流是從外存文件流向內(nèi)存的字節(jié)序列。每一個文件流都有一個內(nèi)存緩沖區(qū)與之對應(yīng)。I/O類庫中定義了以下三種文件流進行文件讀寫操作。1.ifstream類從輸入流istream類派生的,支持從磁盤文件的輸入。2.ofstream類從輸出流ostream類派生的,支持向磁盤文件的輸出。3.fstream類從輸入輸出流iostream類派生的,支持對磁盤文件的輸入輸出。9.4文件流
9.4.1文件流類與對象
ifstream、ofstream和fstream類對象用于內(nèi)存與文件之間的數(shù)據(jù)傳輸9.4文件流
C++把文件看成有序的字節(jié)流,提供低級和高級的IO功能使用方式:程序文件/數(shù)據(jù)文件存取方式:順序讀寫文件/隨機讀寫文件編碼方式:文本文件/二進制文件9.4文件流
9.4.1文件流類與對象
文本模式—任何數(shù)據(jù)被解釋為一系列的字符,內(nèi)存中存儲的二進制數(shù)據(jù)需要轉(zhuǎn)換為字符的形式。二進制模式—無需進行格式的轉(zhuǎn)換,流中直接傳送原始字節(jié)數(shù)據(jù)。
streamclassfileObj(fileName,openMode
);fileObj.open(fileName,openMode);
文件操作的基本步驟: 打開文件 讀/寫文件
關(guān)閉文件<<,put(),write()>>,get(),getline(),read()fileObj.close();9.4文件流
9.4.2文件的打開和關(guān)閉打開文件
建立文件流對象;流對象與磁盤文件關(guān)聯(lián);指定文件的工作方式以及開辟數(shù)據(jù)緩沖區(qū).關(guān)閉文件
解除流對象與磁盤文件關(guān)聯(lián)釋放相關(guān)的系統(tǒng)資源
9.4文件流
構(gòu)造函數(shù)open()析構(gòu)函數(shù)close()打開文件-方法1
先建立流對象,調(diào)用fstream::open()連接外部文件
流類對象名;
對象名.open(文件名,方式);ifstream、ofstream或fstream9.4文件流
文件名是識別文件的標識符,包含路徑、文件名稱以及文件后綴ofreamoutFile
;//流對象打開文件后準備寫入數(shù)據(jù)outFile.open(“C:\\Ch9\\filename.txt”
)
;outFile.open(“filename.txt”
)
;打開文件-方法2調(diào)用流類帶參數(shù)的構(gòu)造函數(shù),建立流對象時連接外部文件
流類對象名(文件名,方式);
eg ifstreaminfile("datafile.dat",ios::in); ofstreamoutfile("d:\\newfile.dat",ios::out);
9.4文件流
參數(shù)分別表示:文件名,文件的打開方式,文件的訪問方式標識常量意義ios::in輸入方式打開文件,進行讀文件操作
ios::out輸出方式打開文件,進行寫文件操作
ios::ate打開文件時,指針指向文件尾ios::app輸出方式打開文件,追加方式寫入ios::trunc刪除文件現(xiàn)有內(nèi)容,把已有文件長度變?yōu)?
ios::nocreate如果文件不存在,則打開操作失敗ios::noreplace如果文件存在,則打開操作失敗ios::binary二進制讀寫方式,數(shù)據(jù)以字符的形式直接在內(nèi)存與文件之間傳送
9.4文件流
文件流的輸入輸出方式基類ios中定義的相關(guān)標志位,用于設(shè)置文件的操作方式默認為文本方式9.4文件流打開一個已有文件準備讀入數(shù)據(jù)的操作ifstreaminfile; infile.open("datafile.dat",ios::in); 準備向文件寫數(shù)據(jù)的操作ofstreamoutfile("D:\\newfile.dat",ios::out);讀寫方式打開文件
fstreamrwfile("myfile.dat",ios::in|ios::out);讀寫二進制文件
fstreamioFile;ioFile.open(file2,ios::in|ios::out|ios::binary);ofstreamofile("a:\\binary",ios::binary|ios::app);
若不存在該文件則在D盤下自動該創(chuàng)建文若文件已存在則清除原有內(nèi)容后輸出用位或運算符“|”對輸入輸出方式進行組合文本文件vs二進制文件2.關(guān)閉文件
關(guān)閉文件操作包括把緩沖區(qū)數(shù)據(jù)完整地寫入文件,添加文件結(jié)束標志,切斷流對象和外部文件的連接當一個流對象的生存期結(jié)束,系統(tǒng)也會自動關(guān)閉文件;若流對象的生存期沒有結(jié)束,用close()關(guān)閉文件后,該流對象可以重用.9.4文件流
ofstreamofile;
//創(chuàng)建輸出文件流
ofile.open("myfile1");//ofile流與文件“myfile1”相關(guān)聯(lián)
…… //訪問文件“myfile1”ofile.close(); //關(guān)閉文件“myfile1”ofile.open(“myfile2”); //重用對象ofile等價于使用構(gòu)造函數(shù):ofstreamofile("myfile1");close()函數(shù)關(guān)閉文件但流對象仍然存在2.關(guān)閉文件9.4文件流使用同一對象可以讀寫多個文件,但要注意:在某一時刻一個文件最多和一個對象關(guān)聯(lián),也不能用多個對象讀寫同一個文件。如果文件對象與不同的文件關(guān)聯(lián),必須先關(guān)閉前一個文件,再打開新的文件3.文件的錯誤檢測
if(!outfile)//outfile.open(“myfile2.dat”){cerr<<“ereor:unabletoopenfile2!”;}測試流狀態(tài)檢測文件是否成功打開調(diào)用ios流類成員函數(shù)good()、bad()與fail()在條件表達式中使用取反操作符(?。y試流狀態(tài)測試成功關(guān)閉文件,可以調(diào)用fail()函數(shù)myfile2.close();if(myfile2.fail())cerr<<”Errortoclosemyfile2!;”9.4文件流012345n-1文件字節(jié)序號文件結(jié)束符EOF文件長度=n文件流的屬性
每次讀寫都是從文件指針的當前位置開始,文件指針的初始位置由打開方式指定,打開文件時文件指針默認指向開始位置。隨著數(shù)據(jù)的讀寫指針就向后移動。文件------------------------內(nèi)存------------------------9.4文件流文件指針使用流的磁盤文件I/OFileMemoryifstreamINPUT>>get()read()OUTPUT<<put()write()磁盤文件目的地源ofstream9.4文件流9.4.3文本文件的讀寫文件的每個字節(jié)都是用ASCII代碼存放數(shù)據(jù),即每個字節(jié)存放一個字符,這種文件又稱字符文件文本文件是順序存取文件文件的默認打開方式為文本文件,格式化的文件讀寫操作。使用流插入運算符“<<”向文件寫入若干個字符,使用流提取運算符“>>”從文件中讀取若干個字節(jié)的數(shù)據(jù),調(diào)用文件流成員函數(shù)進行輸入輸出。
9.4文件流9.4.3文本文件的讀寫9.4文件流inti=10;charch='a'
;ofstreamout("c:\\my.txt");out<<i<<'\t'<<ch<<'\n';out.close();
ifstreamin("c:\\my.dat"); in>>i>>ch; cout<<i<<'\t'<<ch<<endl; 9.4.3文本文件的讀寫9.4文件流inti=10;charch='a'
;ofstreamout("c:\\my.txt");out<<i<<'\t'<<ch<<'\n';out.close();
ifstreamin("c:\\my.dat"); in>>i>>ch; cout<<i<<'\t'<<ch<<endl; 使用<<,>>完成文件讀寫向文本文件中寫入數(shù)據(jù),并從文件中讀出數(shù)據(jù)
9.4文件流例9.8用篩選法產(chǎn)生25個素數(shù),將其寫入C盤文件primes.txt中。例9.9
讀取所有文件primes.txt中的所有素數(shù)//格式化將素數(shù)寫入文件
for(inti=0;i<max;i++){if(i%5==0)outFile<<endl;outFile<<setw(10)<<*(primes+i);
}由于文本文件本身沒有數(shù)據(jù)的邏輯結(jié)構(gòu),為了保證順利從文件中讀取數(shù)據(jù),通常數(shù)據(jù)項之間用空白符、換行符、制表符等分隔9.4文件流例9.10使用getline從文件中讀取字符串charfilename[10]="D://test",str[20]; ofstreamoutfile(filename,ios::out|ios::app);
outfile<<filename<<endl; cout<<"inputastring:"; cin.getline(str,20);//鍵盤輸入字符串
outfile<<str<<endl;//向文件寫入字符串
outfile.close();
9.4文件流例9.10使用getline從文件中讀取字符串
constintMAX=50;charbuffer[MAX];ifstreaminfile;infile.open(filename);
while(!infile.eof()){//讀取文件中所有字符串
infile.getline(buffer,MAX);
cout<<buffer<<'!'<<endl; }infile.close()while(infile.getline(buffer,MAX);)cout<<buffer<<'
!'<<endl; 運行結(jié)果inputastring:TianlinlinD://test
!Tianlinlin
!!
二進制文件以基本類型數(shù)據(jù)在內(nèi)存中以二進制表示形式存放數(shù)據(jù),不對寫入或讀出的數(shù)據(jù)做格式轉(zhuǎn)換;打開二進制文件用ios::binary方式;
可以即為輸出又為輸入文件。二進制文件的讀寫方式由程序控制,常用隨機讀寫操作9.4文件流9.4.4文件的隨機讀寫9.4文件流9.4.4文件的隨機讀寫二進制模式便于進行隨機的文件讀寫操作,通過移動文件指針將數(shù)據(jù)寫入文件的指定位置,或者任意讀取文件中的某個數(shù)據(jù)。二進制文件一般執(zhí)行非格式化的讀取操作:get()、getline()與put()read()與write()讀寫文件可讀取任何類型的數(shù)據(jù),適合高效便利的傳輸數(shù)據(jù)塊。
ostream類中操作字節(jié)數(shù)據(jù)的成員函數(shù)ostream&ostream::write(char*buf,intn);
向流插入buf對象的由第二個參數(shù)指定數(shù)目的字節(jié)數(shù)據(jù)文件無格式讀寫函數(shù)istream類中操作字節(jié)數(shù)據(jù)的成員函數(shù)istream&istream::read(char*buf,intn);從流中提取n個字節(jié)數(shù)據(jù),更新對象buf
9.4文件流從二進制文件讀取len個字節(jié)的數(shù)據(jù),將它們存放在內(nèi)存中buffer指向的內(nèi)存空間。buffer可以轉(zhuǎn)換為其他類型的指針,不僅可以讀取字符數(shù)據(jù),也可以讀取其他類型的數(shù)據(jù)。
文件無格式讀寫函數(shù)istream類中操作字節(jié)數(shù)據(jù)的成員函數(shù)istream&istream::read(char*buf,intn);從流中提取n個字節(jié)數(shù)據(jù),更新對象buf
9.4文件流intiNum,iAry[3];ifstreaminput("file1.dat",ios::binary|ios::in);input.read((char*)(&iNum),sizeof(int))
;
input.read((char*)iAry,3*sizeof(int))
;iNum=input.gcount()/sizeof(int);for(inti=0;i<iNum;i++)cout<<iAry[i]<<ends;input.read(reinterpret_cast<char*>(iAry),3*sizeof(int));
ostream類中寫入字節(jié)數(shù)據(jù)的成員函數(shù)ostream&ostream::write(char*buf,intn);
向流插入buf對象的由第二個參數(shù)指定數(shù)目的字節(jié)數(shù)據(jù)ofstreamoutf("test.dat");charstr[10]=“Hello!”;outf.write(str,10);inta[10]={1,2,3,4,5};for(inti=0;i<10;i++)outf.write((char*)(&a[i]),sizeof(int));
outf.write((reinterpret_cast<char*>(a),10*sizeof(int));
注意類型轉(zhuǎn)換9.4文件流文件無格式讀寫函數(shù)有關(guān)學(xué)生數(shù)據(jù)的結(jié)構(gòu)Stu,讀入一條學(xué)生記錄:BoolreadStudent(Stu&student,ifstream&fStudent){fStudeng.read((char*)&student,sizeof(Stu));booioFlag=fStudent.good();//是否成功讀取
retrunioFlag;}9.4文件流向文件寫入一條結(jié)構(gòu)記錄StuaStudent:Ofstreamout("stu.dat",ios::binary|ios
::out|ios
::app)
;out.write((char*)&aStudent,sizeof(Stu));//將一條記錄寫入文件末尾文件讀寫練習
學(xué)生的記錄包括學(xué)號、姓名和成績等信息:輸入多個學(xué)生記錄
按格式化的方式將學(xué)生記錄寫入文本文件中
writeStu(Stu*s,intn,ofstream&out);(3)按二進制方式寫到文件中:writeFile(stu*s,intn,ofstream&out);
9.4文件流012345n-1文件指針文件指針文件結(jié)束ios::begios::curios::endenumios::seek_dir{beg=0;cur=1,end=2};ios::seek_dir值:cur
相對于當前讀指針所指定的當前位置beg
相對于流的開始位置end
相對于流的結(jié)尾處9.4文件流012345n-1ios::begios::curios::end文件指針9.4文件流
流類提供一些有控制流指針位置的成員函數(shù),可以獲取和改變當前文件指針的位置,以便在文件指定位置進行讀寫操作。
istream&istream::seekg(longpos);
讀指針從流的起始位置向后移動由pos指定字節(jié)
istream&istream::seekg(longoff,ios::seek_dir);
讀指針從流的seek_dir位置移動
off指定字節(jié)istream類操作流讀指針的成員函數(shù)istream&istream::tellg();
返回讀指針當前所指位置值9.4文件流9.4.4文件的隨機讀寫Eg:
istreaminput; ……input.seekg(-10,ios::cur);
//讀指針以當前位置為基準,向前移動10個字節(jié)begendcurcur10.5.4二進制文件istream類操作流讀指針的成員函數(shù)9.4文件流9.4.4文件的隨機讀寫Eg:
istreaminput; ……begendcurinput.seekg(10,ios::beg);//讀指針從流的開始位置,向后移動10個字節(jié)函數(shù) seekg(n);等價seekg(n,ios::beg);cur10.5.4二進制文件istream類操作流讀指針的成員函數(shù)9.4文件流9.4.4文件的隨機讀寫Eg:
istreaminput; ……begendcurcurinput.seekg(-10,ios::end);//讀指針從流的結(jié)尾,向前移動10個字節(jié)istream類操作流讀指針的成員函數(shù)9.4文件流9.4.4文件的隨機讀寫Eg:
istreaminput; longpos=input.tellg(); //獲取當前位置指針
input>>number; //讀入一個整數(shù),指針后移4字節(jié)
……input.seekg(pos); //指針返回原來位置
input>>number; //重讀該整數(shù)begendcur…i-1ii+1…10.5.4二進制文件200311istream類操作流讀指針的成員函數(shù)9.4文件流9.4.4文件的隨機讀寫ostream&ostream::seekp(longpos);
寫指針從流的起始位置向后移動由參數(shù)指定字節(jié)
ostream&ostream::seekp(longoff,ios::seek_dir);
寫指針從流的seek_dir位置移動由
off指定字節(jié)
ostream&ostream::tellp();
返回寫指針當前所指位置值ostream類操作流寫指針的成員函數(shù)10.5.4二進制文件9.4文件流9.4.4文件的隨機讀寫9.4文件流例9.11隨機文件讀寫
fstreamf("DATA.dat",ios::in|ios::out|ios::binary);
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 濟南我的家鄉(xiāng)課件
- 流量營銷培訓(xùn)教學(xué)
- 流程圖培訓(xùn)講解
- 活動志愿者培訓(xùn)
- 城鄉(xiāng)規(guī)劃原理培訓(xùn)課件
- 2024-2025學(xué)年山西省高二下學(xué)期期末考試歷史試題(解析版)
- 2026年化學(xué)實驗操作規(guī)范與安全考題
- 2024-2025學(xué)年江蘇省連云港市高二下學(xué)期3月月考歷史試題(解析版)
- 2026年電子商務(wù)知識考試題庫掌握網(wǎng)絡(luò)營銷技巧
- 2026年中級財務(wù)審計師職稱考試內(nèi)部審計實務(wù)操作練習
- 中藥湯劑煎煮技術(shù)規(guī)范-公示稿
- 水岸·琉璃園-山東淄博留仙湖公園景觀設(shè)計
- 2023人教版 四年級下冊數(shù)學(xué) 第二單元測試卷(含答案)
- 新版出口報關(guān)單模板
- 微型課題研究的過程與方法課件
- 藥學(xué)導(dǎo)論緒論-課件
- 14K118 空調(diào)通風管道的加固
- 加油站財務(wù)管理制度細則
- 真倚天屠龍記劇情任務(wù)詳細攻略武功沖穴步驟
- 《內(nèi)經(jīng)選讀》ppt精品課程課件講義
- 全過程工程咨詢服務(wù)技術(shù)方案
評論
0/150
提交評論