第13章 輸入與輸出流_第1頁
第13章 輸入與輸出流_第2頁
第13章 輸入與輸出流_第3頁
第13章 輸入與輸出流_第4頁
第13章 輸入與輸出流_第5頁
已閱讀5頁,還剩116頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第第1313章章 輸入與輸出流輸入與輸出流 提綱提綱 l輸出流和輸入流的常用成員函數(shù) l流操縱符 l流的錯誤狀態(tài) l文件和流 l文件操作 打開文件打開文件 讀讀 / / 寫文件寫文件 關(guān)閉文件關(guān)閉文件 l字符串流 13.1 C+的輸入和輸出(I/O) n 輸入和輸出,要看以什么為對象 n 以標(biāo)準(zhǔn)I/O設(shè)備為對象 n從鍵盤、鼠標(biāo)得到的數(shù)據(jù)是進(jìn)入從鍵盤、鼠標(biāo)得到的數(shù)據(jù)是進(jìn)入內(nèi)存內(nèi)存的,該數(shù)據(jù)是輸入數(shù)據(jù)。的,該數(shù)據(jù)是輸入數(shù)據(jù)。 n將數(shù)據(jù)從將數(shù)據(jù)從內(nèi)存內(nèi)存送到顯示器、打印機(jī)等,該數(shù)據(jù)是輸出數(shù)據(jù)。送到顯示器、打印機(jī)等,該數(shù)據(jù)是輸出數(shù)據(jù)。 n 以外存磁盤文件為對象 n內(nèi)存中的數(shù)據(jù)內(nèi)存中的數(shù)據(jù)存儲到磁盤文件

2、中,叫輸出文件;存儲到磁盤文件中,叫輸出文件; n從磁盤文件中的數(shù)據(jù)裝載入從磁盤文件中的數(shù)據(jù)裝載入內(nèi)存中內(nèi)存中,叫輸入文件。,叫輸入文件。 n 以內(nèi)存中指定的空間作為對象 n常指定一個字符數(shù)組作為存儲空間,這種常指定一個字符數(shù)組作為存儲空間,這種I/O稱為字符串的輸入稱為字符串的輸入 輸出。輸出。 n C+采取不同的方法實(shí)現(xiàn)以上三種采取不同的方法實(shí)現(xiàn)以上三種I/O。 標(biāo)準(zhǔn)標(biāo)準(zhǔn)I/O 文件文件I/O 串串I/O n數(shù)據(jù)之間的傳輸過程稱作流(stream) n 輸入流輸入流表示數(shù)據(jù)從某個載體或設(shè)備傳送到表示數(shù)據(jù)從某個載體或設(shè)備傳送到 內(nèi)存內(nèi)存 n 輸出流輸出流表示數(shù)據(jù)從內(nèi)存?zhèn)魉偷侥硞€載體或表示數(shù)據(jù)

3、從內(nèi)存?zhèn)魉偷侥硞€載體或 設(shè)備設(shè)備 C+的輸入輸出流 內(nèi)內(nèi) 存存 鍵盤鍵盤 文件文件 光筆光筆. 輸入流輸入流 顯示器顯示器 文件文件 打印機(jī)打印機(jī). 輸出流輸出流 n在進(jìn)行I/O操作時 n 首先進(jìn)行首先進(jìn)行“打開打開”操作,使流和文件發(fā)生聯(lián)系操作,使流和文件發(fā)生聯(lián)系 n 建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出 n I/O結(jié)束后,使用結(jié)束后,使用“關(guān)閉關(guān)閉”操作使文件與流斷開聯(lián)系。操作使文件與流斷開聯(lián)系。 nC+將I/O流定義為類流類。屬于流類 的對象是流對象 n 系統(tǒng)已經(jīng)以系統(tǒng)已經(jīng)以運(yùn)算符或函數(shù)運(yùn)算符或函數(shù)的形式做好了對標(biāo)準(zhǔn)外設(shè)的形式做好了對標(biāo)準(zhǔn)外設(shè)( 鍵盤、

4、顯示器、打印機(jī)、鍵盤、顯示器、打印機(jī)、文件文件)的接口,使用時只需的接口,使用時只需 按照要求的格式調(diào)用即可。按照要求的格式調(diào)用即可。 n 如:如:cin 標(biāo)準(zhǔn)輸入流對象。標(biāo)準(zhǔn)輸入流對象。 cout 標(biāo)準(zhǔn)輸出流對象。標(biāo)準(zhǔn)輸出流對象。 C+的輸入輸出流 C+的各種I/O流類庫 nC+為實(shí)現(xiàn)數(shù)據(jù)的I/O定義了一個龐大的類 庫。它包括的類主要有 C+ I/O類庫中的其他類 輸入和輸出流對象輸入和輸出流對象 l預(yù)先定義的輸出和輸入流對象: cout 標(biāo)準(zhǔn)輸出 cerr 標(biāo)準(zhǔn)錯誤輸出,沒有緩沖,發(fā)送給它的內(nèi) 容立即被輸出。 clog 類似于cerr,但是有緩沖,緩沖區(qū)滿時被 輸出。 cin標(biāo)準(zhǔn)輸入 13

5、.2 標(biāo)準(zhǔn)輸出流 n標(biāo)準(zhǔn)輸出流流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù) ncout流對象在控制臺(顯示器)輸出 n 用用流插入運(yùn)算符流插入運(yùn)算符“”向向cout輸出數(shù)據(jù)輸出數(shù)據(jù). n 如: cout “a=” a endl; cout 數(shù)據(jù)數(shù)據(jù)1 數(shù)據(jù)數(shù)據(jù)2 數(shù)據(jù)數(shù)據(jù)3; ncerr流對象在控制臺(顯示器)輸出錯誤信息 n 用用流插入運(yùn)算符流插入運(yùn)算符“”向向cerr輸出數(shù)據(jù)輸出數(shù)據(jù). n 如: cerr “除數(shù)為除數(shù)為0, 出錯出錯!” endl; cerr的用法與的用法與cout類似類似. ncout流對象與cerr流對象的不同之處 n cout的輸出默認(rèn)是顯示器的輸出默認(rèn)是顯示器,但可以被重定向

6、為輸出到磁盤但可以被重定向為輸出到磁盤 文件文件 n cerr只能定向輸出到顯示器只能定向輸出到顯示器 例13.1 解一元二次方程ax2+bx+c=0 的解 void main( ) float a, b, c, disc; cout a b c; if (a=0) cerr “ a=0, 不是二次方程,出錯!不是二次方程,出錯!”endl; else disc=b*b-4*a*c; if (disc0) cerr“二次方程無實(shí)根。二次方程無實(shí)根。”endl; else cout“x1=”(-b+sqrt(disc)/(2*a)endl; cout “x2=”(-b-sqrt(disc)/(2

7、*a)endl; 標(biāo)準(zhǔn)輸出流 n 標(biāo)準(zhǔn)輸出流流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù) n clog流對象在控制臺(顯示器)輸出錯誤信息. n 用用流插入運(yùn)算符流插入運(yùn)算符“”向向clog輸出數(shù)據(jù)輸出數(shù)據(jù). n 如如: clog “除數(shù)為除數(shù)為0, 出錯出錯!” endl; n clog的用法與的用法與cerr類似類似. n clog流對象與cerr流對象的不同之處 n cerr是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關(guān)信息。是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關(guān)信息。 n clog的輸出先存儲在緩沖區(qū),遇到緩沖區(qū)滿或遇到的輸出先存儲在緩沖區(qū),遇到緩沖區(qū)滿或遇到endl時才向顯時才向顯 示器輸出。示器輸出。 用

8、流對象的成員控制格式輸出 說明: cout.width(n) 與格式控制符與格式控制符setw(n)相似相似 cout.fill(c) 與格式控制符與格式控制符setfill(c)相似相似 cout.setf(ios:dec); cout.unsetf(ios:hex); /書例13-3 #include using namespace std; int main() int a=21; cout.setf(ios:showbase); coutdec:aendl; cout.unsetf(ios:dec); cout.setf(ios:hex); couthex:aendl; cout.un

9、setf(ios:hex); cout.setf(ios:oct); coutoct:aendl; char *pt=China; cout.width(10); coutptendl; cout.width(10); cout.fill(*); coutptendl; double pi=22.0/7.0; cout.setf(ios:scientific); coutpi=; cout.width(14); coutpiendl; cout.unsetf(ios:scientific); cout.setf(ios:fixed); cout.width(12); cout.setf(ios

10、:showpos); cout.setf(ios:internal); cout.precision(6); coutpiab; / 從鍵盤輸入2個整數(shù) n當(dāng)輸入時 n 遇到無效的字符遇到無效的字符 n 或遇到文件結(jié)束符或遇到文件結(jié)束符 ctrl+z 時時 cin處于出錯狀態(tài),無法正常提取數(shù)據(jù)(cin=false). if (!cin) cout“輸入出錯輸入出錯”; 21 abc #include using namespace std; int main( ) float grade; coutgrade) /能從cin流讀取數(shù)據(jù) if(grade=85) coutgradeGOOD!en

11、dl; if(grade60) coutgradefail!endl; coutenter grade:; coutThe end.endl; return 0; 函數(shù)函數(shù)功能功能 read無格式輸入指定字節(jié)數(shù)無格式輸入指定字節(jié)數(shù) get從流中提取字符,包括空格從流中提取字符,包括空格 getline從流中提取一行字符從流中提取一行字符 ignore提取并丟棄流中指定字符提取并丟棄流中指定字符 peek返回流中下一個字符,但不從流中刪除返回流中下一個字符,但不從流中刪除 gcount統(tǒng)計最后輸入的字符個數(shù)統(tǒng)計最后輸入的字符個數(shù) eatwhite忽略前導(dǎo)空格忽略前導(dǎo)空格 seekg移動輸入流指針

12、移動輸入流指針 tellg返回輸入流中指定位置的指針值返回輸入流中指定位置的指針值 istreamistream類的公有成員函數(shù)類的公有成員函數(shù) 輸出流和輸入流的常用成員函數(shù)輸出流和輸入流的常用成員函數(shù) int get(); istream istream istream 讀取一個字符讀取一個字符, 不跳過空白字符不跳過空白字符 讀取一行字符,讀取一行字符, 不提取不提取n 函數(shù)函數(shù)功能功能 read無格式輸入指定字節(jié)數(shù)無格式輸入指定字節(jié)數(shù) get從流中提取字符,包括空格 getline從流中提取一行字符 ignore提取并丟棄流中指定字符提取并丟棄流中指定字符 peek返回流中下一個字符,但

13、不從流中刪除 gcount統(tǒng)計最后輸入的字符個數(shù)統(tǒng)計最后輸入的字符個數(shù) eatwhite忽略前導(dǎo)空格 seekg移動輸入流指針 tellg返回輸入流中指定位置的指針值 istream istreamistream類的公有成員函數(shù)類的公有成員函數(shù) int gcount() const; 輸出流和輸入流的常用成員函數(shù)輸出流和輸入流的常用成員函數(shù) 函數(shù)函數(shù)功能功能 putostream無格式無格式, ,插入一個插入一個 字節(jié)字節(jié) writeostream從無格式從無格式, ,插入一字節(jié)序列插入一字節(jié)序列 flush刷新輸出流刷新輸出流 seekp移動輸出流指針移動輸出流指針 tellp返回輸出流中指

14、定位置的指針值返回輸出流中指定位置的指針值 ostreamostream類的公有成員函數(shù)類的公有成員函數(shù) 用于字符輸入的流成員函數(shù) l不帶參數(shù)的get函數(shù) cin.get( ) n功能功能 n從輸入流提取從輸入流提取1個字符個字符; n函數(shù)返回值就是該字符函數(shù)返回值就是該字符. n若遇到若遇到文件結(jié)束符文件結(jié)束符,則返回值為則返回值為EOF,即即 -1. n如: char ch; while ( (ch=cin.get()!=EOF) cout.put(ch); 鍵盤輸入鍵盤輸入: 顯示顯示: 鍵盤輸入鍵盤輸入: I study C+. (程序結(jié)束程序結(jié)束) I study C+. Ctrl+

15、Z EOFEnd Of File 字符輸出的流成員函數(shù),字符輸出的流成員函數(shù),功功 能能在顯示器上顯示一個在顯示器上顯示一個 字符字符 用于字符輸入的流成員函數(shù) 2. 帶1 個參數(shù)的get函數(shù) cin.get(ch) n功能功能 n從輸入流提取從輸入流提取1個字符放入個字符放入ch; n函數(shù)返回值就是非函數(shù)返回值就是非0值值 n若遇到若遇到文件結(jié)束符文件結(jié)束符,則返回值為則返回值為0 n如: char ch; while ( cin.get(ch)!=0) cout.put(ch); 鍵盤輸入鍵盤輸入: 顯示顯示: 鍵盤輸入鍵盤輸入: I study C+. (程序結(jié)束程序結(jié)束) I stud

16、y C+. Ctrl+Z 用于字符輸入的流成員函數(shù) 3. 帶3 個參數(shù)的get函數(shù) cin.get(字符字符數(shù)組數(shù)組, 字符個數(shù)字符個數(shù)n, 終止字符終止字符) 或或 cin.get(字符字符指針指針, 字符個數(shù)字符個數(shù)n, 終止字符終止字符) n功能功能 n從輸入流提取從輸入流提取n-1個字符放入數(shù)組個字符放入數(shù)組; n函數(shù)返回值就是非函數(shù)返回值就是非0值值 n若遇到若遇到文件結(jié)束符文件結(jié)束符,則返回值為則返回值為0 n如 char str20; cin.get(str, 10,n); coutstr; 鍵盤輸入鍵盤輸入: 顯示顯示: I study C I study C+. cin.ge

17、t() 與 cin.getline() 的比較 cin.get(字符數(shù)組字符數(shù)組, 字符個數(shù)字符個數(shù)n, 終止字符終止字符) cin.getline(字符指針字符指針, 字符個數(shù)字符個數(shù)n, 終止字符終止字符 ) n相同之處: n從輸入流提取從輸入流提取n-1個字符放入數(shù)組個字符放入數(shù)組, n函數(shù)返回值是非函數(shù)返回值是非0值值. n若遇到文件結(jié)束符若遇到文件結(jié)束符,則返回值為則返回值為0. n不同之處: n當(dāng)讀到終止字符時,當(dāng)讀到終止字符時, ncin.getline()將指針移到將指針移到終止字符之后終止字符之后。 ncin.get() 將指針移到將指針移到終止字符處終止字符處。 n則下次繼

18、續(xù)讀取時的位置就不同。(代碼測試一下) void main( ) char c1, c2, c3; char str180, str2100; cout輸入三個字符輸入三個字符:; c1=cin.get( ); cin.get(c2); cin.get(c3); cin.get( ); cout輸入第一行字符串輸入第一行字符串:; cin.get(str1,80); cin.get( ); cout輸入第二行字符串輸入第二行字符串:; cin.getline(str2,80); cout.put(c1).put(c2). put(c3).put(n); cout.write(str1, 3);

19、 cout.write(str2, strlen(str2); cout.put(n); 輸入形式如下: W E Abcdef Abcdefg 輸出結(jié)果? 除了以上介紹的用于讀取數(shù)據(jù)的成員函數(shù)外 ,istream類還有其他在輸入數(shù)據(jù)時用得著的 一些成員函數(shù)。常用的有以下幾種: 1. eof 函數(shù) eof是end of file的縮寫,表示“文件結(jié)束” 。從輸入流讀取數(shù)據(jù),如果到達(dá)文件末尾(遇 文件結(jié)束符),eof函數(shù)值為非零值(表示真), 否則為0(假)。 13.3.3 istream類的其他成員函數(shù) 例13.8 逐個讀入一行字符,將其中的非空格 字符輸出。 #include using na

20、mespace std; int main( ) char c; while(!cin.eof( )/eof( )為假表示未遇到文件結(jié)束符 if(c=cin.get( )!= ) /檢查讀入的字符是否為空格字符 cout.put(c); return 0; 2. peek函數(shù) peek是“觀察”的意思,peek函數(shù)的作用是 觀測下一個字符。其調(diào)用形式為 c=cin.peek( ); 函數(shù)的返回值是指針指向的當(dāng)前字符,但它 只是觀測,指針仍停留在當(dāng)前位置,并不后 移。如果要訪問的字符是文件結(jié)束符,則函 數(shù)值是EOF(-1)。 3. putback函數(shù) 其調(diào)用形式為 cin.putback(ch)

21、; 其作用是將前面用get或getline函數(shù)從輸入流 中讀取的字符ch返回到輸入流,插入到當(dāng)前 指針位置,以供后面讀取。 例13.9 peek函數(shù)和putback函數(shù)的用法。 #include using namespace std; int main( ) char c20; int ch; coutplease enter a sentence:endl; cin.getline(c,15,/); coutThe first part is:cendl; ch=cin.peek( );/觀看當(dāng)前字符 coutThe next character(ASCII code) is:chendl

22、; cin.putback(c0); /將I插入到指針?biāo)柑?cin.getline(c,15,/); coutThe second part is:cendl; return 0; 圖13.4 4. ignore函數(shù) 其調(diào)用形式為 cin,ignore(n, 終止字符) 函數(shù)作用是跳過輸入流中n個字符,或在遇 到指定的終止字符時提前結(jié)束(此時跳過包括 終止字符在內(nèi)的若干字符)。如 ignore(5, A)/跳過輸入流中5個字符,遇A后就不再跳了 也可以不帶參數(shù)或只帶一個參數(shù)。如 ignore(n默認(rèn)值為1,終止字符默認(rèn)為EOF) 相當(dāng)于 ignore(1,EOF) 例13.10用ignore

23、函數(shù)跳過輸入流中的字符。 先看不用ignore函數(shù)的情況: #include using namespace std; int main( ) char ch20; cin.get(ch,10,/); coutThe first part is:chendl; cin.get(ch, 10,/); coutThe second part is:chendl; return 0; 如果輸入下面的情況,運(yùn)行結(jié)果如何: (1)1234567890/ (2)123456/ 如果希望第二個cin.get函數(shù)能讀取I study C+.,就應(yīng)該設(shè)法跳過輸入流中第一個/, 可以用ignore函數(shù)來實(shí)現(xiàn)此目的

24、,將程序改 為 #include using namespace std; int main( ) char ch20; cin.get(ch,20,/); cout“The first part is:”chendl; cin.ignore( );/跳過輸入流中一個字符 cin.get(ch,20,/); cout“The second part is:”chendl; return 0; 以上介紹的各個成員函數(shù),不僅可以用cin流 對象來調(diào)用,而且也可以用istream類的其他 流對象調(diào)用。 標(biāo)識常量標(biāo)識常量值值意義意義 ios: goodbit0 x00狀態(tài)正常狀態(tài)正常 ios: eof

25、bit0 x01文件結(jié)束符,當(dāng)文件結(jié)尾時設(shè)置該標(biāo)志文件結(jié)束符,當(dāng)文件結(jié)尾時設(shè)置該標(biāo)志 ios: failbit0 x02I/O操作失敗,數(shù)據(jù)未丟失,可以恢復(fù)操作失敗,數(shù)據(jù)未丟失,可以恢復(fù) ios: badbit0 x04非法操作,數(shù)據(jù)丟失,不可恢復(fù)非法操作,數(shù)據(jù)丟失,不可恢復(fù) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 流錯誤狀態(tài)流錯誤狀態(tài) 所有流都把流的狀態(tài)存儲在狀態(tài)字中所有流都把流

26、的狀態(tài)存儲在狀態(tài)字中 不同標(biāo)志位中存儲不同的錯誤狀態(tài)位不同標(biāo)志位中存儲不同的錯誤狀態(tài)位 包含在類包含在類iosios的的enumenum成員中成員中 ios ios 處理流錯誤狀態(tài)的公有成員函數(shù)處理流錯誤狀態(tài)的公有成員函數(shù) 函數(shù)函數(shù)功能功能 int eof() const; 返回返回eofbit狀態(tài)值。文件結(jié)束符時返回狀態(tài)值。文件結(jié)束符時返回1,否則返回,否則返回0 int fail() const; 返回返回failbit狀態(tài)值狀態(tài)值 int good() const; eofbit、failbit和和badbit都沒有被設(shè)置,則返回都沒有被設(shè)置,則返回1 int bad() const;

27、badbit被設(shè)置,則返回被設(shè)置,則返回1 (當(dāng)發(fā)生嚴(yán)重錯誤:如數(shù)據(jù)(當(dāng)發(fā)生嚴(yán)重錯誤:如數(shù)據(jù) 丟失)丟失) int rdstate() const; 返回狀態(tài)字返回狀態(tài)字 void clear( int nState = 0 ); 恢復(fù)或設(shè)置狀態(tài)字例如:恢復(fù)或設(shè)置狀態(tài)字例如:clear(ios:failbit) 流錯誤狀態(tài)流錯誤狀態(tài) #include using namespace std; int integerValue; / display results of cin functions cout Before a bad input operation: ncin.rdstate()

28、: cin.rdstate() n cin.eof(): cin.eof() n cin.fail(): cin.fail() n cin.bad(): cin.bad() n cin.good(): cin.good() integerValue; / enter character value cout endl; / display results of cin functions after bad input cout After a bad input operation: ncin.rdstate(): cin.rdstate() n cin.eof(): cin.eof() n

29、 cin.fail(): cin.fail() n cin.bad(): cin.bad() n cin.good(): cin.good() endl endl; cin.clear(); / clear stream / display results of cin functions after clearing cin cout After cin.clear() ncin.fail(): cin.fail() ncin.good(): cin.good() x coutxoutfile a b ; 10.5.3 文本文件 a 0X00f3 b 0X004e 文件和流文件和流 0 1

30、2 3 4 5 2 4 3 7 8 a 0X00f3 b 0X004e int c ; c = a + b ; fout c= c a b ; 寫文件寫文件 c 0X0141 c = 3 2 1 n 文件和流文件和流 文件操作文件操作 文件操作的基本步驟:文件操作的基本步驟: 定義一個文件流對象定義一個文件流對象 打開文件打開文件 讀讀 / / 寫文件寫文件 關(guān)閉文件關(guān)閉文件 使用文件流類,使用文件流類, 必須包含頭文件必須包含頭文件 #include 文件操作文件操作 - -定義一個文件流對象定義一個文件流對象 如:如: /用于與一個用于與一個輸入輸入文件建立聯(lián)系文件建立聯(lián)系 ifstrea

31、m infile; ifstream infile; / /用于與一個用于與一個輸出輸出文件建立聯(lián)系文件建立聯(lián)系 ofstream outfile; ofstream outfile; /用于與一個用于與一個輸入輸出輸入輸出文件建立聯(lián)文件建立聯(lián) fstream iofile; fstream iofile; 文件操作文件操作- -打開文件打開文件 與外部文件關(guān)聯(lián);與外部文件關(guān)聯(lián); 指定文件的打開方式;指定文件的打開方式; 有兩種方式打開文件有兩種方式打開文件 方法方法1 1: 調(diào)用流類帶參數(shù)的構(gòu)造函數(shù)調(diào)用流類帶參數(shù)的構(gòu)造函數(shù) 建立流對象時連接外部文件建立流對象時連接外部文件 流類流類 對象名對

32、象名 ( ( 文件名文件名 , , 方式方式 ) ;) ; 文件操作文件操作- -打開文件打開文件 ifstream、ofstream 或或 fstream 第二個參數(shù)表示文件的打開方式 標(biāo)識常量標(biāo)識常量意義意義 ios:in 讀方式打開文件讀方式打開文件 ios:out 寫方式打開文件寫方式打開文件 ios:ate 打開文件時,指針指向文件尾打開文件時,指針指向文件尾 ios:app 追加方式追加方式 ios:trunc 刪除文件現(xiàn)有內(nèi)容刪除文件現(xiàn)有內(nèi)容 ios:binary 二進(jìn)制方式打開,默認(rèn)為文本方式二進(jìn)制方式打開,默認(rèn)為文本方式 ios:in|ios:out 以輸入和輸出方式打開文件

33、,文件可讀以輸入和輸出方式打開文件,文件可讀 寫寫 ios:out|ios:binary 或者或者 ios:in|ios:binary 以二進(jìn)制方式打開一個輸出(或者輸入)以二進(jìn)制方式打開一個輸出(或者輸入) 文件文件 10.5.2 打開和關(guān)閉文件 文件操作文件操作- -打開文件打開文件 例如:例如: ifstream infile ( datafile.dat , ios:in ) ; ofstream outfile ( d:newfile.dat , ios:out ); fstream rwfile ( myfile.dat , ios:in | ios:out ) ; ofstrea

34、m ofile ( a:binary , ios : binary | ios : app ) ; 用用 “| |”(或運(yùn)算符)連接兩(或運(yùn)算符)連接兩 個表示打開方式的標(biāo)識常量個表示打開方式的標(biāo)識常量 10.5.2 打開和關(guān)閉文件 打開一個二進(jìn)制文件進(jìn)行追加操作打開一個二進(jìn)制文件進(jìn)行追加操作 文件操作文件操作- -打開文件打開文件 文件操作文件操作- -打開文件打開文件 方法方法2 2 先建立流對象,后調(diào)用先建立流對象,后調(diào)用fstream:open()fstream:open()函函 數(shù)連接外部文件數(shù)連接外部文件 流類流類 對象名對象名 ; ; 對象名對象名.open ( .open (

35、文件名文件名 , , 方式方式 ) ;) ; 打開文件成員函數(shù)打開文件成員函數(shù) 格式:格式: void fstream:open(const char *, int, int=filebuf:openprot); void ifstream:open(const char *, int=ios:in, int=filebuf:openprot); void ofstream:open(const char *, int=ios:out, int=filebuf:openprot); 打開的文件名打開的文件名文件的打開方式文件的打開方式 文件打開時的保護(hù)方式文件打開時的保護(hù)方式, 如:獨(dú)占打開如

36、:獨(dú)占打開 無缺省值無缺省值 參數(shù)參數(shù) ios: 意義意義 文件操作文件操作- -打開文件打開文件 打開一個已有文件打開一個已有文件datafile.datdatafile.dat,準(zhǔn)備讀:,準(zhǔn)備讀: ifstream infile ;ifstream infile ;/ / 建立輸入文件流對象建立輸入文件流對象 infile.open( infile.open( “datafile.datdatafile.dat” , ios:in ) ; , ios:in ) ; / / 連接文件,指定打開方式連接文件,指定打開方式 打開(創(chuàng)建)一個文件打開(創(chuàng)建)一個文件newfile.datnewfi

37、le.dat,準(zhǔn)備寫:,準(zhǔn)備寫: ofstream outfile ;ofstream outfile ;/ / 建立輸出文件流對象建立輸出文件流對象 outfile.open( d:newfile.dat , ios:out ) ; outfile.open( d:newfile.dat , ios:out ) ; / / 連接文件,指定打開方式連接文件,指定打開方式 與與 cin 和和 cout 的用法相同的用法相同 如:如:infile x; outfile y; 對文件進(jìn)行讀寫操作對文件進(jìn)行讀寫操作 在對文件進(jìn)行讀寫時,我們將文件看成在對文件進(jìn)行讀寫時,我們將文件看成字符流字符流, 文

38、件流文件流 讀寫位置指針讀寫位置指針 隨著文件的讀寫,指針移動。隨著文件的讀寫,指針移動。 關(guān)閉文件操作包括把緩沖區(qū)數(shù)據(jù)完整地寫入文件,關(guān)閉文件操作包括把緩沖區(qū)數(shù)據(jù)完整地寫入文件, 添加文件結(jié)束標(biāo)志,切斷流對象和外部文件的連接添加文件結(jié)束標(biāo)志,切斷流對象和外部文件的連接 當(dāng)一個流對象的生存期結(jié)束,系統(tǒng)也會自動關(guān)閉文當(dāng)一個流對象的生存期結(jié)束,系統(tǒng)也會自動關(guān)閉文 件;件; 若流對象的生存期沒有結(jié)束,用若流對象的生存期沒有結(jié)束,用close()close()關(guān)閉文件關(guān)閉文件 后,該流對象可以重用后,該流對象可以重用 文件操作文件操作- -關(guān)閉文件關(guān)閉文件 文件操作文件操作- -關(guān)閉文件關(guān)閉文件 vo

39、id ifstream:close( ); void ofstream:close( ); void fstream:close( ); 如:如:infile.close( ); /切斷與輸入文件切斷與輸入文件 myfile1.txt 的聯(lián)系的聯(lián)系 outfile.close( ); /切斷與輸出文件切斷與輸出文件 myfile2.txt 的聯(lián)系的聯(lián)系 iofile.close( ); /切斷與輸入輸出文件切斷與輸入輸出文件 myfile3.txt 的聯(lián)系的聯(lián)系 文件讀寫完畢,必須關(guān)閉。文件讀寫完畢,必須關(guān)閉。 關(guān)閉文件成員函數(shù)關(guān)閉文件成員函數(shù) 格式格式 : eg: ofstream ofil

40、e ;ofstream ofile ;/ / 創(chuàng)建輸出文件流創(chuàng)建輸出文件流 ofile . open ( ofile . open ( “myfile1myfile1” , ios:outios:out ) ;) ; / ofile/ ofile流與文件流與文件“myfile1myfile1”相關(guān)聯(lián)相關(guān)聯(lián) / / 訪問訪問文件文件“myfile1myfile1” ofile . close ( ) ; ofile . close ( ) ;/ / 關(guān)閉關(guān)閉文件文件“myfile1myfile1” ofile . open ( ofile . open ( “myfile2myfile2”, i

41、os:out ); ios:out ); / / 重用對象重用對象ofileofile 等價于使用構(gòu)造函數(shù):等價于使用構(gòu)造函數(shù): ofstream ofile ( “myfile1” , ios:out ) ; 10.5.2 打開和關(guān)閉文件 文件操作文件操作- -關(guān)閉文件關(guān)閉文件 close ( ) close ( ) 函數(shù)關(guān)閉文件函數(shù)關(guān)閉文件 但流對象仍然存在但流對象仍然存在 打開與關(guān)閉錯誤打開與關(guān)閉錯誤 if( !outfile) / 之前outfile.open(“myfile2.dat”) cerr” error: unable to open file2!”; 檢測文件是否成功打開,

42、可在條件表達(dá)式中使檢測文件是否成功打開,可在條件表達(dá)式中使 用取反操作符(?。y試流狀態(tài)用取反操作符(?。y試流狀態(tài) (一般是讀文件的時候用)一般是讀文件的時候用) 為了測試成功關(guān)閉文件,可以調(diào)用為了測試成功關(guān)閉文件,可以調(diào)用fail()fail()函數(shù),如函數(shù),如 myfile2.close(); if(myfile2.fail() cerrxy; myfile1.txt 3 4 內(nèi)存內(nèi)存 infile x y 3 4 用用infile代替代替myfile1.txt 進(jìn)行操作。進(jìn)行操作。 如何從文件中讀出數(shù)據(jù)? ofstream outfile; /定義輸出文件類對象定義輸出文件類對象 ou

43、tfile.open(“myfile2.txt”); /利用函數(shù)打開某一文利用函數(shù)打開某一文 件件 float x3 , y4; outfilextyxy; outfilextyendl; infile.close(); outfile.close(); myfile1.txt 3 4 內(nèi)存內(nèi)存 infile x y 3 4 myfile2.txt outfile 34 infile.close( ); outfile.close( ); 用完文件后,使用成員函數(shù)關(guān)閉文件 文件讀寫文件讀寫 - - 文本文件(順序文件)文本文件(順序文件) 文本文件文本文件 文件的每個字節(jié)都是用文件的每個字節(jié)都

44、是用ASCIIASCII代碼存放數(shù)據(jù),代碼存放數(shù)據(jù), 即每個字節(jié)存放一個字符,這種文件又稱字符文件即每個字節(jié)存放一個字符,這種文件又稱字符文件 文件的默認(rèn)打開方式為文本文件文件的默認(rèn)打開方式為文本文件 文本文件是順序存取文件文本文件是順序存取文件 文本文件本身沒有記錄邏輯結(jié)構(gòu),文本文件本身沒有記錄邏輯結(jié)構(gòu), 通常一個邏輯記通常一個邏輯記 錄用換行符分隔;數(shù)據(jù)項之間可以用空白符、換行錄用換行符分隔;數(shù)據(jù)項之間可以用空白符、換行 符、制表符等分隔。符、制表符等分隔。 #include #include using namespace std; void main( ) int a10; ofstr

45、eam outfile(“f1.dat”); /定義文件流對象,打開文件定義文件流對象,打開文件f1.dat if (!outfile) /若打開失敗,返回若打開失敗,返回 0值值 cerropen error!endl; exit(1); coutenter 10 integer numbers:endl; for(int i=0;iai; outfileai ; /向文件向文件f1.dat輸出數(shù)據(jù)輸出數(shù)據(jù) outfile.close(); /關(guān)閉文件關(guān)閉文件f1.dat 例13.11 有一個整型數(shù)組,含10個元素,從鍵盤輸入10個整 數(shù)給數(shù)組,將此數(shù)組送到磁盤文件地f1.dat中存放。 文

46、件處理流程文件處理流程 定義并打開文件對象定義并打開文件對象 打開文件出錯處理打開文件出錯處理 對文件進(jìn)對文件進(jìn)行行R/W操作操作 關(guān)閉文件對象關(guān)閉文件對象 #include #include using namespace std; void main ( ) ofstream ost ; ost.open (C:my2.txt ) ; ost 1234567890 endl ; int a = 123 ; ost a endl ; ost setw ( 10 ) a endl ; ost setiosflags ( ios : left ) setfill ( # ) setw ( 10

47、) a endl ; ost setiosflags ( ios : right ) setprecision ( 5 ) setw ( 10 ) 12.34567890 endl ; ost . close ( ) ; 例例:使用格式控制建立的文本文件使用格式控制建立的文本文件 以指定格式以指定格式 插入數(shù)據(jù)插入數(shù)據(jù) 默認(rèn)方式默認(rèn)方式 打開文本文件打開文本文件 #include #include using namespace std; void main() ofstream out(test.txt ) ; if ( !out ) cout cannot open file. ; ret

48、urn ; out 10 123.45 ; out nThis is a short text file. ; out.close () ; 例:例: 將數(shù)據(jù)寫入到將數(shù)據(jù)寫入到文件文件 對數(shù)值常量對數(shù)值常量 做轉(zhuǎn)換做轉(zhuǎn)換 #include #include using namespace std; void main () char ch ; int i ; float f ; char str1 10 , str2 10 ; ifstream in ( test.txt ) ; if ( ! in ) cout i f ch str1 str2 ; cout i “ ” f “ ” ch n

49、 ; cout str1 str2 endl ; in.close () ; ifstream in int i float f char ch char str1 char str2 10.5.3 文本文件 例例 從從文件文件 讀出數(shù)據(jù)讀出數(shù)據(jù) #include #include using namespace std; void main () char ch ; int i ; float f ; char str1 10 , str2 10 ; ifstream in ( test.txt ) ; if ( ! in ) cout i f ch str1 str2 ; cout i “

50、 ” f “ ” ch n ; cout str1 str2 endl ; in.close () ; 10.5.3 文本文件 例例 :從:從文件文件 讀出數(shù)據(jù)讀出數(shù)據(jù) int i 10 float f 123.45 char ch T char str1 his char str2 is ostream cout #include using namespace std; void main() char str = tNew string ; ofstream f2 (test.txt , ios:app ) ; / 追加方式追加方式 if ( !f2 ) cout cannot open

51、 testnew for ouput. ; return ; f2 str ;/ 插入字符串插入字符串 f2.close () ; 例在例在文件文件 testnew testnew 的末尾添加字符串的末尾添加字符串 插入串插入串 #include #include using namespace std; void main ( ) char ch ; ifstream f1 ( test.txt ) ; if ( !f1 ) cout cannot open test for input. ; return ; ofstream f2 ( testnew.txt ) ; if ( !f2 )

52、 cout cannot open testnew for ouput. ; return ; while ( f1 f1.close () ; f2.close () ; cout It is over !n ; ifstream f1 ofstream f2 ch 10.5.3 文本文件 例例: :復(fù)制數(shù)據(jù)到文件復(fù)制數(shù)據(jù)到文件 將文件將文件testtest的內(nèi)容復(fù)制到的內(nèi)容復(fù)制到testnew testnew 中中 例例 將數(shù)值將數(shù)值1100及其平方根寫入文件及其平方根寫入文件 sqrttable.txt #include #include #include using namespace

53、 std; void main( ) double x; ofstream out; / 定義一個輸出流對象定義一個輸出流對象 out.open(sqrttable.txt); / 打開文本文件打開文本文件sqrttable.txt for(x=1; x=100; x+) outxtsqrt(x)endl; / 將結(jié)果寫入文件將結(jié)果寫入文件 out.close( ); / 關(guān)閉文件關(guān)閉文件 例例 編寫一個程序,用于顯示一個文本文件編寫一個程序,用于顯示一個文本文件 #include #include using namespace std; void main( ) char filename

54、40, line80; ifstream infile; coutfilename; / A infile.open(filename); / B 如果打開不成功,如果打開不成功, infile 為為 0 if(!infile) coutCan not open file: filenameendl; exit(1); while(infile.getline(line, 80) / 讀入一行讀入一行 coutlinech) / 讀入一個字符讀入一個字符 coutch; / 顯示一個字符顯示一個字符 例例 從一個文本文件從一個文本文件source.txt中讀入若干整數(shù),中讀入若干整數(shù), 用選擇

55、法將這些數(shù)據(jù)排成升序,用選擇法將這些數(shù)據(jù)排成升序, 將排序后的結(jié)果寫入將排序后的結(jié)果寫入 另一個文件文本文件另一個文件文本文件target.txt中中 事前準(zhǔn)備數(shù)據(jù)文件:事前準(zhǔn)備數(shù)據(jù)文件: source.txt #include #include using namespace std; void sort(int *a, int n) /一般的選擇法排序函數(shù) int i, j, p, t; for(i=0; in-1; i+) p=i; for(j=i+1; jn; j+) if(ajap) p=j; if(p!=i) t=ai;ai=ap; ap=t; void main( ) int a

56、100, i, n; fstream in, out; in.open(c:source.txt, ios:in); if(!in) coutCan not open source.txt!endl; exit(1); out.open(c:target.txt, ios:out); if(!out) coutCan not open target.txt!ai) i+; /循環(huán)結(jié)束后,i是整數(shù) 的個數(shù) sort(a, i ); n=i; for(i=0; in; i+) outaiendl; in.close( ); out.close( ); 文件讀寫文件讀寫 -二進(jìn)制文件(隨機(jī)存取文件)

57、二進(jìn)制文件(隨機(jī)存取文件) 二進(jìn)制文件以基本類型數(shù)據(jù)在內(nèi)存的二進(jìn)制表示形式二進(jìn)制文件以基本類型數(shù)據(jù)在內(nèi)存的二進(jìn)制表示形式 存放數(shù)據(jù),不對寫入或讀出的數(shù)據(jù)做格式轉(zhuǎn)換存放數(shù)據(jù),不對寫入或讀出的數(shù)據(jù)做格式轉(zhuǎn)換 ; 打開二進(jìn)制文件用打開二進(jìn)制文件用ios:binaryios:binary方式方式 ; 二進(jìn)制文件的讀寫方式由程序控制二進(jìn)制文件的讀寫方式由程序控制 ; 二進(jìn)制文件是隨機(jī)存取文件二進(jìn)制文件是隨機(jī)存取文件 。 13.4.5 對二進(jìn)制文件的操作 若在文件的打開方式中沒有特別說明,打開的文件均為若在文件的打開方式中沒有特別說明,打開的文件均為ASCII碼碼 文件,文件,若要打開二進(jìn)制文件,則要特別

58、說明并用特定的讀寫函數(shù)若要打開二進(jìn)制文件,則要特別說明并用特定的讀寫函數(shù)。 fstream infile,outfile; infile.open(“inf1.dat”, ios:in| ios:binary); outfile.open(“outf1.dat”, ios:out| ios:binary); 文件名文件名 輸入方式打開輸入方式打開 二進(jìn)制文件二進(jìn)制文件 文件名文件名 輸出方式打開輸出方式打開 二進(jìn)制文件二進(jìn)制文件 1. 文件的讀寫操作(成塊讀寫)文件的讀寫操作(成塊讀寫) 成員函數(shù):成員函數(shù): istream istream istream ostream ostream os

59、tream 前三個為讀取操作前三個為讀取操作:將第二個參數(shù)指定的字節(jié)數(shù)讀入到:將第二個參數(shù)指定的字節(jié)數(shù)讀入到 以第一個參數(shù)為起始地址的內(nèi)存中。以第一個參數(shù)為起始地址的內(nèi)存中。 后三個為寫操作后三個為寫操作:從第一個參數(shù)為起始地址的內(nèi)存開始,:從第一個參數(shù)為起始地址的內(nèi)存開始, 將連續(xù)的第二個參數(shù)指定字節(jié)數(shù)的將連續(xù)的第二個參數(shù)指定字節(jié)數(shù)的 內(nèi)容寫到文件中。內(nèi)容寫到文件中。 0 1 2 3 4 5 n-1 文件指針文件指針 10.5.1 文件和流 ios:begios:cur ios:end 二進(jìn)制文件的順序讀寫二進(jìn)制文件的順序讀寫 流的狀態(tài)表示:流的內(nèi)容、長度和操作位置流的狀態(tài)表示:流的內(nèi)容、長

60、度和操作位置 ostream 類中兩個操作字節(jié)數(shù)據(jù)的成員函數(shù)類中兩個操作字節(jié)數(shù)據(jù)的成員函數(shù) ofstream outf( test.dat , ios:out | ios:binary ) ; int a10 =1,2,3,4,5; for(int i = 0; i 10 ; i + ) outf.write( (char *) ( outf.close(); 二進(jìn)制文件的順序讀寫二進(jìn)制文件的順序讀寫 outf.write(reinterpret_cast (a) , 10*sizeof(int); istream 類中操作字節(jié)數(shù)據(jù)的成員函數(shù)類中操作字節(jié)數(shù)據(jù)的成員函數(shù) get ( char c

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論