版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第13章 輸入輸出流13.1 C+的輸入和輸出13.2 標(biāo)準(zhǔn)輸出流13.3 標(biāo)準(zhǔn)輸入流13.4 對數(shù)據(jù)文件的操作與文件流13.1 C+的輸入和輸出輸入和輸出,要站在內(nèi)存中程序的立場來看: 輸入:將某設(shè)備中的數(shù)據(jù)傳送給程序;設(shè)備中的數(shù)據(jù)叫輸入文件。 輸出:將程序中的數(shù)據(jù)傳送到某設(shè)備;設(shè)備得到的數(shù)據(jù)叫輸出文件。以鍵盤/顯示器作為標(biāo)準(zhǔn)輸入/輸出設(shè)備: 從鍵盤、鼠標(biāo)等得到的數(shù)據(jù)是進(jìn)入內(nèi)存中程序的,該數(shù)據(jù)是輸入數(shù)據(jù)(輸入文件)。 將數(shù)據(jù)從內(nèi)存中程序送到顯示器、打印機(jī)等,該數(shù)據(jù)是輸出數(shù)據(jù)(輸出文件)。以外存磁盤文件作為設(shè)備: 內(nèi)存中程序的數(shù)據(jù)存儲到磁盤文件中,叫輸出文件;從磁盤文件中的數(shù)據(jù)裝載入內(nèi)存中,叫
2、輸入文件。以內(nèi)存中指定的空間作為設(shè)備:字符串的輸入輸出。 在C+語言中,數(shù)據(jù)的輸入和輸出(簡寫為I/O)包括對標(biāo)準(zhǔn)輸入設(shè)備“鍵盤”和標(biāo)準(zhǔn)輸出設(shè)備“顯示器”、對在外存磁盤上的文件和對內(nèi)存中指定的字符串存儲空間進(jìn)行輸入輸出這三個方面。 對標(biāo)準(zhǔn)輸入設(shè)備和標(biāo)準(zhǔn)輸出設(shè)備的輸入輸出簡稱為標(biāo)準(zhǔn)I/O;對在外存磁盤上文件的輸入輸出簡稱為文件I/O;對內(nèi)存中指定的字符串存儲空間的輸入輸出簡稱為串I/O。C+的輸入和輸出 C+中把數(shù)據(jù)的傳送過程稱作流。在C+中,流既可以表示數(shù)據(jù)從內(nèi)存?zhèn)魉偷侥硞€載體或設(shè)備中,即輸出流;也可以表示數(shù)據(jù)從某個載體或設(shè)備傳送到內(nèi)存的變量中,即輸入流。 在進(jìn)行I/O操作時,首先進(jìn)行“打開”
3、操作,使流和文件發(fā)生聯(lián)系,建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出,輸入或輸出結(jié)束后,使用“關(guān)閉”操作使文件與流斷開聯(lián)系。 C+將輸入輸出流定義為類-流類。屬于流類的對象是流對象。如:cin-標(biāo)準(zhǔn)輸入流對象。 cout標(biāo)準(zhǔn)輸出流對象。C+的輸入流和輸出流各種流類C+為實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出定義了一個龐大的類庫。它包括的類主要有 ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream,strstream 等。頭文件中定義的類 C+系統(tǒng)中的I/O類庫,其所有類被包含在iostream,fstream和str
4、stream 這三個系統(tǒng)頭文件中,各頭文件包含的類如下:iostream頭文件包含有: ios, iostream, istream, ostream, iostream_withassign, istream_withassign, ostream_withassign等。fstream包含有: fstream, ifstream, ofstream和fstreambase, 以及iostream中的所有類。strstream包含有: strstream, istrstream, ostrstream和strstreambase, 以及iostream中的所有類。 包含頭文件在一個程序中當(dāng)需
5、要進(jìn)行標(biāo)準(zhǔn)I/O操作時,則必須包含頭文件iostream;當(dāng)需要進(jìn)行文件I/O操作時,則必須包含頭文件fstream; 當(dāng)需要進(jìn)行串I/O操作時,則必須包含頭文件strstream。當(dāng)使用格式化I/O時,則包含頭文件iomanip在一個程序中包含一個頭文件的命令格式為“#include” 如:#include 4個流對象 cin,cout,cerr, clog C+不僅定義有現(xiàn)成的I/O類庫供用戶使用,而且還為用戶進(jìn)行標(biāo)準(zhǔn)I/O操作定義了四個類對象,它們分別是cin,cout,cerr和clog. cin : istream_withassign流類的對象,使用標(biāo)準(zhǔn)輸入設(shè)備鍵盤,是從鍵盤輸入數(shù)
6、據(jù)傳送到內(nèi)存的數(shù)據(jù)流,也稱為cin流或標(biāo)準(zhǔn)輸入流. 后三個為ostream_withassign流類的對象: cout : 使用標(biāo)準(zhǔn)輸出設(shè)備顯示器,是從內(nèi)存數(shù)據(jù)傳送到顯示器的數(shù)據(jù)流,也稱為cout流或標(biāo)準(zhǔn)輸出流. 4個流對象 cin,cout,cerr, clog cerr和clog含義相同,均代表將錯誤信息輸出到顯示器的流。 當(dāng)進(jìn)行鍵盤輸入時使用cin流; 當(dāng)進(jìn)行顯示器輸出時使用cout流; 當(dāng)進(jìn)行錯誤信息輸出時使用cerr流或clog流。 13.2 標(biāo)準(zhǔn)輸出流 cout流對象-Console output縮寫. 在控制臺(顯示器)輸出.用流插入運(yùn)算符“”向cout輸出數(shù)據(jù).如: cout
7、“a=” a endl; cout 數(shù)據(jù)1 數(shù)據(jù)2 數(shù)據(jù)3; 這里的數(shù)據(jù)都是C+的基本類型的數(shù)據(jù). 若是自定義類型的數(shù)據(jù)(如結(jié)構(gòu)體), 則必須對“”重載后才能輸出.13.2 標(biāo)準(zhǔn)輸出流 cerr流對象-Console error. 在控制臺(顯示器)輸出錯誤信息.用流插入運(yùn)算符“”向cerr輸出數(shù)據(jù).如: cerr “除數(shù)為0, 出錯!” endl; cerr的用法與cout類似.不同: cout的輸出目標(biāo)默認(rèn)是顯示器,但可以被重定向為輸出到磁盤文件。 cerr不能重定向輸出。例13.1 解一元二次方程ax2+bx+c=0 的解。int main( ) float a, b, c, disc;
8、 cout a b c; if (a=0) cerr “ a=0, 不是二次方程,出錯!”endl; else disc=b*b-4*a*c; if (disc0) cerr“二次方程無實(shí)根?!眅ndl; else cout“x1=”(-b+sqrt(disc)/(2*a)endl; cout “x2=”(-b-sqrt(disc)/(2*a)endl; return 0;clog流對象-在控制臺(顯示器)輸出錯誤信息.用流插入運(yùn)算符“”向clog輸出數(shù)據(jù).如: clog “除數(shù)為0, 出錯!” endl; clog的用法與cerr類似.不同: cerr是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關(guān)信息
9、。而clog的輸出先存儲在緩沖區(qū),遇到緩沖區(qū)滿或遇到endl時才向顯示器輸出。標(biāo)準(zhǔn)類型數(shù)據(jù)的格式輸出使用控制符控制輸出格式dec - 設(shè)置整數(shù)的基數(shù)為10hex - 設(shè)置整數(shù)的基數(shù)為16oct - 設(shè)置整數(shù)的基數(shù)為8setfill(c) - 設(shè)置填充字符csetprecision(n) - 設(shè)置實(shí)數(shù)的顯示精度為n位setw(n) - 設(shè)置字段寬度為nsetiosflags(ios:fixed) - 實(shí)數(shù)以固定的小數(shù)位數(shù)顯示setiosflags(ios:scientific) - 實(shí)數(shù)以科學(xué)記數(shù)顯示例: 用控制符控制輸出格式#include #include using nanespace s
10、td;int main( ) int a; cout a; / 輸入34 cout“dec:”decaendl; /顯示: dec:34 cout“hex:”hexaendl; /顯示: hex:22 cout“oct:”octaendl; /顯示: oct:42 coutsetfill(*)setw(10)decaendl; / *34 return 0;格式輸出2. 使用流對象的成員函數(shù)控制輸出格式cout.precision(n) 與格式控制符setprecision(n) 相似cout.width(n) 與格式控制符setw(n)相似cout.fill(c) 格式控制符setfill(
11、c)相似cout.setf(格式標(biāo)志) 與setiosflags (格式標(biāo)志) 相似cout.unsetf(格式標(biāo)志) 與resetioflags(格式標(biāo)志)相似 格式標(biāo)志:ios:left 左對齊ios:right 右對齊ios:internal 兩邊對齊ios:doc 十進(jìn)制例: 用流控制成員函數(shù)控制輸出格式#include #include using nanespace std;int main( ) int a; cout a; / a=34 cout“hex:”hexaendl; /顯示: hex:22 cout.setf(ios:hex); cout“hex:”aendl; /
12、hex:22 cout.unsetf(ios:hex); cout.fill(*); cout.width(10); cout.setf(ios:dec); coutaendl; / *34 return 0;用流成員函數(shù)put輸出字符 cout.put(字符); 輸出一個字符如: cout.put(a); 輸出 a cout.put(97); 輸出 aC語言的函數(shù): putchar(字符);如: putchar(a);例13.3 有一個字符串BASIC,要求把它們按相反的順序輸出。#include using namespace std;int main( )char *p=BASIC; /
13、字符指針指向B for(int i=4; i=0; i-) cout.put(*(p+i); /從最后一個字符開始輸出 cout.put( n ); return 0;運(yùn)行時在屏幕上輸出: CISAB13.3 標(biāo)準(zhǔn)輸入流 標(biāo)準(zhǔn)輸入流是指從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)流向程序中的變量的數(shù)據(jù). cin流對象 int a,b; cin ab; / 從鍵盤輸入2個整數(shù) 當(dāng)輸入時遇到無效的字符或遇到文件結(jié)束符ctrl+C時, cin處于出錯狀態(tài),無法正常提取數(shù)據(jù).如:輸入:123 abc a接收了123 b無法接收輸入值,cin被置為出錯狀態(tài),cin的值為0(假值)。 if (!cin) / cin處于出錯狀態(tài)
14、,無法正常提取數(shù)據(jù) cout“輸入出錯”;例 通過測試cin的真值,判斷流對象是否處于正常狀態(tài)。#include using namespace std;int main( ) float grade; coutgrade) /能從cin流讀取數(shù)據(jù) if(grade=85) coutgradeGOOD!endl; if(grade60) coutgradefail!endl; coutenter grade:; coutThe end.endl; return 0;例 通過測試cin的真值,判斷流對象是否處于正常狀態(tài)。#include using namespace std;int main(
15、 ) float grade; coutgrade) /能從cin流讀取數(shù)據(jù) if(grade=85) coutgradeGOOD!endl; if(grade60) coutgradefail!endl; coutenter grade:; coutThe end.endl; return 0;enter grade: 67enter grade: 8989 GOOD!enter grade: 5656 fail!enter grade: 100100 GOOD!enter grade: CThe end.用于字符輸入的流成員函數(shù)不帶參數(shù)的get函數(shù) cin.get() 從輸入流提取1個字符
16、; 函數(shù)返回值就是該字符.若遇到文件結(jié)束符,則返回值為EOF,即 -1. 如: char ch; while ( (ch=cin.get()!=EOF) cout.put(ch); 鍵盤輸入: I study C+. 顯示: I study C+. 鍵盤輸入: Ctrl+C (程序結(jié)束)用于字符輸入的流成員函數(shù)2. 帶1個參數(shù)的get函數(shù) cin.get(ch) 從輸入流提取1個字符放入ch, 函數(shù)返回值是非0值.若遇到文件結(jié)束符,則返回值為0. 如: char ch; while ( cin.get(ch)!=0) cout.put(ch); 鍵盤輸入: I study C+. 顯示: I
17、study C+. 鍵盤輸入: Ctrl+C (程序結(jié)束)用于字符輸入的流成員函數(shù)3. 帶3個參數(shù)的get函數(shù) cin.get(字符數(shù)組, 字符個數(shù)n, 終止字符)或 cin.get(字符指針, 字符個數(shù)n, 終止字符) 從輸入流提取n-1個字符放入數(shù)組, 函數(shù)返回值是非0值.若遇到文件結(jié)束符,則返回值為0. 如: char str20; cin.get(str, 10, n); coutstr; 鍵盤輸入: I study C+. 顯示: I study C用于字符輸入的流成員函數(shù)4. cin.getline函數(shù) cin.getline(字符數(shù)組, 字符個數(shù)n, 終止字符)或 cin.get
18、line(字符指針, 字符個數(shù)n, 終止字符) 從輸入流提取n-1個字符放入數(shù)組, 函數(shù)返回值是非0值.若遇到文件結(jié)束符,則返回值為0. 如: char str20; cin.getline(str, 10, n); coutstr; 鍵盤輸入: I study C+. 顯示: I study Ccin.get 與 cin.getline 的區(qū)別 cin.get(字符數(shù)組, 字符個數(shù)n, 終止字符)和 cin.getline(字符指針, 字符個數(shù)n, 終止字符)相同: 從輸入流提取n-1個字符放入數(shù)組, 函數(shù)返回 值是非0值.若遇到文件結(jié)束符,則返回值為0.不同: 當(dāng)讀到終止字符時,cin.g
19、etline將指針移到 終止字符之后。get將指針移到終止字符處。 則下次繼續(xù)讀取時的位置就不同。用于字符輸入的流成員函數(shù)5. cin.eof函數(shù) cin.eof(): 當(dāng)從輸入流讀取數(shù)據(jù)到達(dá)文件尾,函數(shù)值為真。 如: char c; while (!cin.eof() if (c=cin.get()!= ) cout.put(c); coutendl; 鍵盤輸入: I study C+. 顯示: IstudyC+.13.4 對數(shù)據(jù)文件的操作與文件流文件: 存儲在某種設(shè)備(磁帶、光盤、軟盤或硬盤)上數(shù)據(jù)的集合;對用戶來說,文件分成兩大類: 程序文件, 數(shù)據(jù)文件.從文件中數(shù)據(jù)的組織形式來分: A
20、SCII文件(文本文件), 二進(jìn)制文件通常,操作系統(tǒng)管理文件,跟蹤它們的位置、大小、創(chuàng)建時間等。除非在操作系統(tǒng)級別上編程,否則不必?fù)?dān)心這些事情.13.4.1 文件的概念文本文件和二進(jìn)制文件文本文件(ASCII文件): 文件中的內(nèi)容都是字符, 以ASCII碼形式存在文件內(nèi). 如: 12345在文本文件中是以 1,2,3,4,55個字符形式存儲的二進(jìn)制文件: 文件中的內(nèi)容是以數(shù)據(jù)的二進(jìn)制形式存儲的. 如: 12345在二進(jìn)制文件中按1個整數(shù)類型以二進(jìn)制形式存儲,占4個字節(jié)空間13.4.2 文件流類和文件流對象文件流 把外存文件的輸入輸出看作文件流;輸入文件流: 從文件將數(shù)據(jù)傳送到內(nèi)存中程序,該數(shù)據(jù)
21、是輸入文件流;輸出文件流: 從內(nèi)存中程序?qū)?shù)據(jù)傳送到文件中,該數(shù)據(jù)是輸出文件流;輸入文件流類: ifstream輸入文件流對象: ifsream infile;輸出文件流類: ofstream輸出文件流對象: ofstream outfile;輸入輸出文件流類: fstream輸入輸出文件流對象: fstream myfile;C+角度的輸入和輸出流充當(dāng)了程序和流源或流目標(biāo)之間的橋梁;使得C+程序可以以相同的方式對待來自鍵盤的輸入和來自文件的輸入;同理,通過使用流,C+程序處理輸出的方式將獨(dú)立于其去向; / 標(biāo)準(zhǔn)I/O的例子#include using namespace std;int ma
22、in() int a,b,c; cinab; c=a+b; cout“c=“c cin - 程序端: 程序中的變量a,b文件端: stdout - cout - 程序端: 程序中的 “c=”,c簡單的文件I/O要讓程序?qū)?shù)據(jù)寫入文件,必須:創(chuàng)建一個ofstream對象來管理輸出流;將該對象與特定的文件關(guān)聯(lián)起來;以使用cout的方式使用該對象,唯一的區(qū)別是:輸出將進(jìn)入文件,而不是屏幕;#include /必須包含的頭文件 using namespace std;int main()int a=12 , b=34; ofstream fout; /定義ofstream類對象fout fout.op
23、en(c:c_05temptest.dat, ios:out); /使文件流與test.dat建立關(guān)聯(lián) foutaendl; foutbendl; fout.close( ); /將輸出文件流所關(guān)聯(lián)的磁盤文件關(guān)閉 return 0;/例 將int a=12, b=34寫到磁盤文件中讀取文件#include #include using namespace std;int main( )int x, y; ifstream infile; infile.open(c:c_05temptest.dat, ios:in); infilexy; coutx=xendl; couty=yendl; in
24、file.close( ); return 0;13.4.3 文件的打開與關(guān)閉打開磁盤文件(1) 調(diào)用文件流對象的成員函數(shù)open:文件流對象.open(磁盤文件名, 輸入輸出方式)ofstream outfile;outfile.open(d:mydoca1.dat, ios:out);(2) 在定義文件流對象時直接初始化ofstream outfile(d:mydoca1.dat, ios:out);文件的輸入輸出方式設(shè)置值ios:in - 打開輸入文件ios:out - 打開輸出文件,文件不存在時新建, 存在時 刪除全部內(nèi)容,變成空文件(若out方式不與別 的方式組合,等同于trunc方
25、式)ios:app - 打開輸出文件, 寫入的數(shù)據(jù)添入文件尾ios:ate - 打開已有文件, 文件指針指向文件尾ios:trunc - 截斷文件:若打開文件存在,則文件的內(nèi)容刪 除;若不存在,則新建文件。ios:binary - 二進(jìn)制文件ios:nocreate - 打開已有文件, 不新建(新版本中取消)ios:in | ios:out - 打開輸入輸出文件,但不變空文件ios:out | ios:binary - 已二進(jìn)制方式打開輸出文件ios:in | ios:binary - 已二進(jìn)制方式打開輸入文件說明: 新版本的I/O類庫中不提供ios:nocreate和ios:noreplac
26、e。 每一個打開的文件都有一個文件指針。 可以用“位或”運(yùn)算符“|”對輸入輸出方式進(jìn)行組合。 如果打開操作失敗,open函數(shù)的返回值為0(假),如果是用調(diào)用構(gòu)造函數(shù)的方式打開文件的,則流對象的值為0。13.4.4 對ASCII文件的操作 如果文件的每一個字節(jié)中均以ASCII代碼形式存放數(shù)據(jù),即一個字節(jié)存放一個字符,這個文件就是ASCII文件(或稱字符文件)。程序可以從ASCII文件中讀入若干個字符,也可以向它輸出一些字符。 對ASCII文件的讀寫操作可以用以下兩種方法: (1) 用流插入運(yùn)算符“”輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù)。(2) 用本章13.2.3節(jié)和13.3.2節(jié)中介紹的文件流的put, ge
27、t, geiline等成員函數(shù)進(jìn)行字符的輸入輸出。例13.8 有一個整型數(shù)組,含10個元素,從鍵盤輸入10個整數(shù)給數(shù) 組,將此數(shù)組送到磁盤文件中存放。#include #include using namespace std;int main( )int a10;/定義文件流對象,打開磁盤文件f1.dat ofstream outfile(f1.dat, ios:out); if(!outfile) /如果打開失敗,outfile返回 0值 cerropen error! endl; exit(1); coutenter 10 integer numbers:endl; for(int i=0
28、;iai; outfileai ; /向磁盤文件f1.dat輸出數(shù)據(jù) outfile.close(); /關(guān)閉磁盤文件f1.dat return 0; 例13.9 從例13.8建立的數(shù)據(jù)文件f1.dat中讀入10個整數(shù)放在數(shù)組中,找出并輸出10個數(shù)中的最大者和它在數(shù)組中的序號。#include #include using namespace std;int main( ) int a10,max,i,order; /定義輸入文件流對象,以輸入方式打開磁盤文件f1.dat ifstream infile(f1.dat,ios:in|ios:nocreate); if (!infile) cer
29、ropen error! endl; exit(1); for(i=0;iai;/從磁盤文件讀入10個整數(shù),順序存放在a數(shù)組中 coutai ; /在顯示器上順序顯示10個數(shù) coutendl; max=a0; order=0; for(i=1;imax) max=ai; /將當(dāng)前最大值放在max中 order=i; /將當(dāng)前最大值的元素序號放在order中 coutmax=maxendlorder=orderendl; infile.close( ); return 0;運(yùn)行情況如下: 1 3 5 2 4 6 10 8 7 9(在磁盤文件中存放的10個數(shù))max=10 (最大值為10)ord
30、er=6 (最大值是數(shù)組中序號為6的元素)從磁盤文件中讀入數(shù)據(jù),直到文件結(jié)束#include #include using namespace std;int main( )int a; ifstream infile; infile.open(f1.dat, ios:in); if(!infile) cerra; if ( infile.good( ) ) / 上述的 infilea 正常輸入了數(shù)據(jù) couta ; infile.close( ); return 0;從磁盤文件中讀入數(shù)據(jù)存入數(shù)組,直到文件結(jié)束#include #include using namespace std;int
31、main( )int b1000, n; ifstream infile; infile.open(c:f1.dat, ios:in); if(!infile) cerrbn; if ( infile.good( ) ) / 上述的 infilebn 正常輸入了數(shù)據(jù) n+ ; for (int i=0; in; i+) coutbi ; infile.close( ); return 0;編一程序?qū)⑷我馕谋疚募?nèi)容讀入內(nèi)存,然后輸出到顯示器??梢跃幰粋€專用函數(shù)。#include #include using namespace std;void display_file(char *filen
32、ame) ifstream infile(filename, ios:in); if(!infile) cerropen filename error!endl; exit(1); char ch; while( infile.get(ch) ) / 每次從文件讀入1個字符存入ch cout.put(ch); / 在顯示器顯示ch的字符 coutendl; infile.close( );int main( )display_file(f3.txt); /將f3.txt的入口地址傳給形參filename return 0;運(yùn)行時輸出f3.dat中的字符: NEWBEIJINGGREATOLYP
33、ICCHINAint main( ) char fname40; coutfname; / 從鍵盤輸入文件名:f3.txt display_file( fname ); return 0;例13.10 從鍵盤讀入一行字符,把其中的字母字符依次存放在磁盤文件f2.dat中。再把它從磁盤文件讀入程序,將其中的小寫字母改為大寫字母,再存入磁盤文件f3.dat。#include #include using namespace std;/ save_to_file函數(shù)從鍵盤讀入一行字符,并將其中的字母存入磁盤文件void save_to_file( ) ofstream outfile(f2.dat)
34、; /定義輸出文件流對象outfile,以輸出方式打開磁盤文件f2.dat if (!outfile) cerropen f2.dat error!=65 & ci=97 & ci=122) /如果是字母字符 outfile.put(ci); /將字母字符存入磁盤文件f2.dat coutci; /同時送顯示器顯示coutendl;outfile.close( ); /關(guān)閉f2.dat/從磁盤文件f2.dat讀入字母字符,將其中的小寫字母改為大寫字母,再存入f3.datvoid get_from_file() char ch; ifstream infile(f2.dat,ios:in|ios
35、:nocreate); /定義輸入文件流outfile,以輸入方式打開磁盤文件f2.dat if(!infile) cerropen f2.dat error!endl; exit(1); ofstream outfile(f3.dat); /定義輸出文件流outfile,以輸出方式打開磁盤文件f3.dat if(!outfile) cerropen f3.dat error!=97 & ch=122) /判斷ch是否為小寫字母 ch=ch-32; /將小寫字母變?yōu)榇髮懽帜?outfile.put(ch); /將該大寫字母存入磁盤文件f3.dat coutch; /同時在顯示器輸出 coute
36、ndl;infile.close( ); /關(guān)閉磁盤文件f2.datoutfile.close(); /關(guān)閉磁盤文件f3.dat int main( ) save_to_file( ); /調(diào)用save_to_file( ),從鍵盤讀入一行字符并將其中的字母存入磁盤文件f2.dat get_from_file( ); /調(diào)用get_from_file(),從f2.dat讀入字母字符,改為大寫字母,再存入f3.dat return 0;運(yùn)行情況如下: New Beijing, Great Olypic, 2008, China.NewBeijingGreatOlypicChina (將字母寫入磁
37、盤文件f2.dat,同時在屏幕顯示)NEWBEIJINGGREATOLYPICCHINA (改為大寫字母)13.4.5 對二進(jìn)制文件的操作 二進(jìn)制文件不是以ASCII代碼存放數(shù)據(jù)的,它將內(nèi)存中數(shù)據(jù)存儲形式不加轉(zhuǎn)換地傳送到磁盤文件,因此它又稱為內(nèi)存數(shù)據(jù)的映像文件。因為文件中的信息不是字符數(shù)據(jù),而是字節(jié)中的二進(jìn)制形式的信息,因此它又稱為字節(jié)文件。一個長整數(shù)100000,在內(nèi)存中占4個字節(jié),如果按內(nèi)部格式直接輸出,在磁盤文件中占4個字節(jié),如果將它轉(zhuǎn)換為ASCII碼形式輸出,則要占6個字節(jié) 對二進(jìn)制文件的操作也需要先打開文件,用完后要關(guān)閉文件。在打開時要用ios:binary指定為以二進(jìn)制形式傳送和存
38、儲。二進(jìn)制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件。這是和ASCII文件不同的地方。輸入文件:ifstream infile(stud.dat, ios:in | ios:binary);輸出文件:ofstream infile(stud.dat, ios:out | ios:binary);輸入輸出文件:fstream infile(stud.dat, ios:in | ios:out | ios:binary);1. 用成員函數(shù)read和write讀寫二進(jìn)制文件對二進(jìn)制文件的讀寫主要用fstream類的成員函數(shù)read和write來實(shí)現(xiàn)。這兩個成員函數(shù)的原型為r
39、ead(char *buffer, int len);write(const char * buffer, int len);字符指針buffer指向內(nèi)存中一段存儲空間。len是讀寫的字節(jié)數(shù)。調(diào)用的方式為outfile. write(p1,50);infile. read(p2,30);例13.11 將一批數(shù)據(jù)以二進(jìn)制形式存放在磁盤文件中。#include #include using namespace std;struct studentchar name20; int num; int age; char sex;int main( )student stud3=Li , 1001, 1
40、8, f, Fun, 1002, 19, m, Wang,1004, 17, f ; ofstream outfile(stud.dat, ios:out | ios:binary); if(!outfile) cerropen error! endl; abort( ); /退出程序 for(int i=0; i3; i+) outfile.write(char*)&studi, sizeof(studi);outfile.close( );return 0;可以一次輸出整個數(shù)組到磁盤文件:outfile.write(char*)&stud0, sizeof(stud);用這種方法一次可以輸
41、出一批數(shù)據(jù),效率較高。在輸出的數(shù)據(jù)之間不必加入空格,在一次輸出之后也不必加回車換行符。在以后從該文件讀入數(shù)據(jù)時不是靠空格作為數(shù)據(jù)的間隔,而是用字節(jié)數(shù)來控制。例13.12 將剛才以二進(jìn)制形式存放在磁盤文件中的數(shù)據(jù)讀入內(nèi)存并在顯示器上顯示。#include #include using namespace std;struct studentstring name; / 改為 char name20; int num; int age; char sex;int main( )student stud3; int i; ifstream infile(stud.dat, ios:in | ios:
42、binary); if(!infile) cerropen error! endl; abort( ); for(i=0;i3;i+) infile.read(char*)&studi , sizeof(studi); infile.close( ); for(i=0;i3;i+) coutNO. i+1endl; coutname:endl; coutnum:studi.numendl; coutage:studi.ageendl; coutsex:studi.sexendlendl; return 0; 能否一次讀入文件中的全部數(shù)據(jù),如 infile.read( (ch
43、ar*)&stud0 , sizeof(stud) ); 可以。運(yùn)行時在顯示器上顯示:NO.1name: Linum: 1001age: 18sex: fNO.2name: Funnum: 1001age: 19sex: mNO.3name: Wangnum: 1004age: 17sex: f2. 與文件指針有關(guān)的流成員函數(shù) 在磁盤文件中有一個文件指針,用來指明當(dāng)前應(yīng)進(jìn)行讀寫的位置。對于二進(jìn)制文件(文本文件也行),允許對指針進(jìn)行控制,使它按用戶的意圖移動到所需的位置,以便在該位置上進(jìn)行讀寫。文件流提供一些有關(guān)文件指針的成員函數(shù)。infile.gcount( ) 返回最新一次輸入的字節(jié)數(shù)如:i
44、nfile.read( &stud, sizeof(stud) );if (infile.gcount( ) sizeof(stud) ) cout“讀入數(shù)據(jù)有誤!”; infile.tellg( ) 函數(shù)返回輸入文件指針的當(dāng)前位置 (long型整數(shù),以字節(jié)為單位,從0算起)infile.seekg( 文件中的位置 );將輸入文件的指針移到指定的 位置infile.seekg( 位移量,參照位置 ); 將輸入文件指針移到從 參照位置為基礎(chǔ)移動若干字節(jié)位置Outfile.tellp( ) 返回輸出文件指針的當(dāng)前位置Outfile.seekp( 文件中的位置 )Outfile.seekp( 位移量
45、,參照位置 )infile.seekg( 位移量,參照位置 ); 將輸入文件指針移到從 參照位置為基礎(chǔ)移動若干字節(jié)位置Outfile.seekp( 位移量,參照位置 );將輸出文件指針移到從 參照位置為基礎(chǔ)移動若干字節(jié)位置參照位置:ios:beg 文件開頭begin(默認(rèn)值) ios:cur 指針當(dāng)前位置current ios:end 文件末尾(已超出文件尾)如: infile.seekg(100); 輸入文件指針移到文件第101字節(jié) 處。第1個字符的位置是0 infile.seekg(-50, ios:cur );從當(dāng)前位置回移50個字節(jié)值得注意的是: 當(dāng)文件對象發(fā)生操作異常(指針已在文件尾
46、,還要讀數(shù)據(jù),則eof發(fā)生;打開文件失??;)時,其之后的相關(guān)操作都會失效。因此,要用clear( )函數(shù)將其錯誤狀態(tài)清除,使得其后的操作有效。 fin.seekg(0 , ios:beg); cout“begin=”fin.tellg()endl; / 顯示 0 fin.seekg(0,ios:end); fin.get(); / 在文件尾還要讀數(shù)據(jù),eof出現(xiàn)。fin狀態(tài)異常 coutend=fin.tellg( )eof( )=fin.eof()endl;/ 顯示:end= -1 eof( )=1 fin.seekg(0,ios:beg); / 由于fin狀態(tài)異常,seekg不起作用cou
47、t“begin=”fin.tellg()endl; / 顯示:begin= -1值得注意的是: 當(dāng)文件對象發(fā)生操作異常(指針已在文件尾,還要讀數(shù)據(jù),則eof發(fā)生;打開文件失敗;)時,其之后的相關(guān)操作都會失效。因此,要用clear( )函數(shù)將其錯誤狀態(tài)清除,使得其后的操作有效。 fin.seekg(0,ios:beg); cout“begin=”fin.tellg()endl; / 顯示 0 fin.seekg(0,ios:end); fin.get(); / 在文件尾還要讀數(shù)據(jù),eof出現(xiàn)。fin狀態(tài)異常 coutend=fin.tellg( )eof( )=fin.eof()endl;/ 顯示:end= -1 eof( )=1fin.clear( ); / 將fin的異常狀態(tài)清除 fin.seekg(0,ios:beg); / seekg起作用,指針移到文件頭cout“begin=”fin.tellg( )endl; / 顯示
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版房地產(chǎn)抵押回購交易合同范本3篇
- 二零二五年度預(yù)應(yīng)力鋼筋進(jìn)出口代理合同3篇
- 室內(nèi)設(shè)計公司2025年度市場推廣合同2篇
- 二零二五年度船舶設(shè)備個人買賣合同2篇
- 二零二五年度高空作業(yè)安全責(zé)任免除服務(wù)合同3篇
- 二零二五版保姆雇傭合同與雇主合作共贏協(xié)議3篇
- 二零二五版抵債協(xié)議:債權(quán)債務(wù)清算與資產(chǎn)轉(zhuǎn)讓合同3篇
- 2025版超薄浮法玻璃出口貿(mào)易合同范本3篇
- 二零二五版建筑外墻防水涂料研發(fā)與銷售合同3篇
- 二零二五版快遞物流企業(yè)碳排放管理與減排協(xié)議合同3篇
- 【S洲際酒店婚禮策劃方案設(shè)計6800字(論文)】
- 醫(yī)養(yǎng)康養(yǎng)園項目商業(yè)計劃書
- 《穿越迷宮》課件
- 《C語言從入門到精通》培訓(xùn)教程課件
- 2023年中國半導(dǎo)體行業(yè)薪酬及股權(quán)激勵白皮書
- 2024年Minitab全面培訓(xùn)教程
- 社區(qū)電動車棚新(擴(kuò))建及修建充電車棚施工方案(純方案-)
- 項目推進(jìn)與成果交付情況總結(jié)與評估
- 鐵路項目征地拆遷工作體會課件
- 醫(yī)院死亡報告年終分析報告
- 建設(shè)用地報批服務(wù)投標(biāo)方案(技術(shù)方案)
評論
0/150
提交評論