




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第1313章章 C+C+流和文件流流和文件流 C+語言中沒有專門的輸入語言中沒有專門的輸入/輸出(輸出(I/O)語句,)語句,C+中的中的I/O操作是通過一組標準操作是通過一組標準I/O函數(shù)和函數(shù)和I/O流流來實現(xiàn)的。來實現(xiàn)的。 C+的標準的標準I/O函數(shù)是從函數(shù)是從C語言繼承而來的,語言繼承而來的,同時對同時對C語言的標準語言的標準I/O函數(shù)進行了擴充。函數(shù)進行了擴充。 C+的的I/O流不僅擁有標準流不僅擁有標準I/O函數(shù)的功能,而函數(shù)的功能,而且比且比I/O函數(shù)更方便、更可靠。函數(shù)更方便、更可靠。13.1 什么是流什么是流 C+中把數(shù)據(jù)之間的傳輸操作稱作流。在中把數(shù)據(jù)之間的傳輸操作稱作流
2、。在C+中,中,流既可以表示數(shù)據(jù)從內存?zhèn)魉偷侥硞€載體或設備中,流既可以表示數(shù)據(jù)從內存?zhèn)魉偷侥硞€載體或設備中,即輸出流;也可以表示數(shù)據(jù)從某個載體或設備傳送即輸出流;也可以表示數(shù)據(jù)從某個載體或設備傳送到內存緩沖區(qū)變量中,即輸入流。到內存緩沖區(qū)變量中,即輸入流。 在進行在進行I/O操作時,操作步驟如下:操作時,操作步驟如下: (1)打開操作,使流和文件發(fā)生聯(lián)系,建立聯(lián))打開操作,使流和文件發(fā)生聯(lián)系,建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出;系后的文件才允許數(shù)據(jù)流入或流出; (2)輸入或輸出操作;)輸入或輸出操作; (3)結束后,使用關閉操作使文件與流斷開聯(lián))結束后,使用關閉操作使文件與流斷開聯(lián)系。系。
3、C+中所有流都是相同的,但操作的文件可以不中所有流都是相同的,但操作的文件可以不同。同。 使用流以后,程序用流統(tǒng)一對各種計算機設備和使用流以后,程序用流統(tǒng)一對各種計算機設備和文件進行操作,使程序與設備、程序與文件無關,從文件進行操作,使程序與設備、程序與文件無關,從而提高了程序設計的通用性和靈活性。而提高了程序設計的通用性和靈活性。 也就是說,無論與流相聯(lián)系的實際物理設備差別也就是說,無論與流相聯(lián)系的實際物理設備差別有多大,流都采用相同的方式運行。有多大,流都采用相同的方式運行。 這種機制使得流可以跨越物理設備平臺,實現(xiàn)流這種機制使得流可以跨越物理設備平臺,實現(xiàn)流的透明運作,而與實際的物理設備
4、無關。例如,往顯的透明運作,而與實際的物理設備無關。例如,往顯示器上輸出字符和向磁盤文件或打印機輸出字符,盡示器上輸出字符和向磁盤文件或打印機輸出字符,盡管接收輸出的物理設備不同,但具體操作過程是相同管接收輸出的物理設備不同,但具體操作過程是相同的。的。13.1.1 預定義流預定義流 在程序開始運行時,在程序開始運行時,C+會自動打開會自動打開4個流,這個流,這些流是些流是C+流類庫的預定義流,如下表所列。流類庫的預定義流,如下表所列。流流含義含義所屬類庫所屬類庫默認設備默認設備cin標準輸入標準輸入iostream.h鍵盤鍵盤cout標準輸出標準輸出iostream.h顯示器顯示器cerr沒
5、有被緩沖的沒有被緩沖的標準錯誤輸出標準錯誤輸出iostream.h顯示器顯示器clog被緩沖了的標被緩沖了的標準錯誤輸出準錯誤輸出iostream.h顯示器顯示器 C+的流通過重載運算符的流通過重載運算符“”執(zhí)行輸出執(zhí)行輸出和輸入操作。和輸入操作。 輸出操作是向流中插入一個字符序列,因此,在輸出操作是向流中插入一個字符序列,因此,在流操作中,將運算符流操作中,將運算符“”稱為稱為提取運算符提取運算符。1cout cout是與標準輸出設備連接的預定義輸出流,是與標準輸出設備連接的預定義輸出流,稱為匯。稱為匯。C+的插入運算符的插入運算符“”向輸出流發(fā)送字符。向輸出流發(fā)送字符。實際上,位于插入運算
6、符右側的字符串被存儲在實際上,位于插入運算符右側的字符串被存儲在“”左側的流中。例如:左側的流中。例如: cout name number n; cout是數(shù)據(jù)的目的地,插入運算符是數(shù)據(jù)的目的地,插入運算符“”處流進程序。為了保留輸入數(shù)據(jù),輸入語句處流進程序。為了保留輸入數(shù)據(jù),輸入語句要求有目的地址,即指定數(shù)據(jù)類型的存儲單元,例如:要求有目的地址,即指定數(shù)據(jù)類型的存儲單元,例如: int i; cin i; 這段代碼所進行的操作是:提取運算符這段代碼所進行的操作是:提取運算符“”從從cin參數(shù)中提取一個整型輸入數(shù)據(jù),并存入一個對象參數(shù)中提取一個整型輸入數(shù)據(jù),并存入一個對象(變量),在此例中即為
7、整型數(shù)(變量),在此例中即為整型數(shù)i。 cin一般連接到標準輸入設備即鍵盤(默認設一般連接到標準輸入設備即鍵盤(默認設備)。備)。3cerr cerr類似標準錯誤文件。類似標準錯誤文件。cerr與與cout的差別在于:的差別在于: (1)cerr是不能重定向的;是不能重定向的; (2)cerr不能被緩沖,它的輸出總是直接傳送到不能被緩沖,它的輸出總是直接傳送到標準輸出設備上。標準輸出設備上。 錯誤信息是寫到錯誤信息是寫到cerr的項。即使在各種其他輸出的項。即使在各種其他輸出語句中,如果使用下列語句,則錯誤信息語句中,如果使用下列語句,則錯誤信息“Error”總能保證在顯示器上顯示出來:總能保
8、證在顯示器上顯示出來: cerr Error n;4clog clog是不能重定向的,但是可以被緩沖。在某些是不能重定向的,但是可以被緩沖。在某些系統(tǒng)中,由于緩沖,使用系統(tǒng)中,由于緩沖,使用clog代替代替cerr可以改進顯示可以改進顯示速度:速度: clog Error n;13.1.2 C+的流類庫的流類庫 C+提供了一個流類庫,流類庫由若干完成提供了一個流類庫,流類庫由若干完成I/O操作的基礎類以及若干支持特定種類的源和目標的操作的基礎類以及若干支持特定種類的源和目標的I/O操作類組成。操作類組成。 流類庫的基礎類利用繼承關系組織起來,其類層流類庫的基礎類利用繼承關系組織起來,其類層次如
9、下圖所示,這些類的說明如表次如下圖所示,這些類的說明如表13.2所列。所有所列。所有使用流類庫的程序必須用使用流類庫的程序必須用“#include”編譯指令將編譯指令將iostream.h包含進來。包含進來。 ios istream ostream istrstream istream _withassign ifstream iostream ofstream ostream _withassign ostrstream fstream strstream I/OI/O流類庫的類層次流類庫的類層次輸入流類輸入流類istream通用輸入流類和其他輸入流的基類通用輸入流類和其他輸入流的基類ios
10、tream.hifstream輸入文件流類輸入文件流類fstream.histream_withassigncin的輸入流類的輸入流類iostream.histrstream輸入字符串流類輸入字符串流類strstrea.h輸出流類輸出流類ostream通用輸出流類和其他輸出流的基類通用輸出流類和其他輸出流的基類iostream.hofstream輸出文件流類輸出文件流類fstream.hostream_withassigncout、cerr和和clog的輸出流類的輸出流類iostream.hostrstream輸出字符串流類輸出字符串流類strstrea.hI/O流類流類iostream通用通
11、用I/O流類和其他流類和其他I/O流的基類流的基類iostream.hfstreamI/O文件流類文件流類fstream.hstrstreamI/O字符串流類字符串流類strstrea.h13.2 13.2 格式化格式化I/OI/O 在以前的程序中,所有在以前的程序中,所有I/O采用的格式都是由采用的格式都是由C+流類庫提供的默認方式。流類庫提供的默認方式。 在實際應用中,常常需要準確控制數(shù)據(jù)(特別在實際應用中,常常需要準確控制數(shù)據(jù)(特別是整數(shù)、浮點數(shù)與字符串)的是整數(shù)、浮點數(shù)與字符串)的I/O格式。格式。 流類庫可用兩種方法控制數(shù)據(jù)的格式:使用流類庫可用兩種方法控制數(shù)據(jù)的格式:使用ios類的
12、成員函數(shù)和使用類的成員函數(shù)和使用I/O操縱符。操縱符。13.2.1 使用使用ios成員函數(shù)成員函數(shù) 每一個每一個C+流都有自己當前的數(shù)據(jù)格式控制狀態(tài),流都有自己當前的數(shù)據(jù)格式控制狀態(tài),這些狀態(tài)用一個長整數(shù)表示,即這些狀態(tài)用一個長整數(shù)表示,即ios類的數(shù)據(jù)成員類的數(shù)據(jù)成員x_flags,稱為格式化標志字。,稱為格式化標志字。 這些格式化標志字在這些格式化標志字在ios類中定義為公有的枚舉量。類中定義為公有的枚舉量。 在在iostream.h頭文件中定義了以下枚舉類型:頭文件中定義了以下枚舉類型:enum skipws = 0 x0001, /跳過輸入中的空白跳過輸入中的空白(空格、制表符、回車、
13、換行等空格、制表符、回車、換行等) left = 0 x0002, /輸出左對齊輸出左對齊 right = 0 x0004, /輸出右對齊輸出右對齊 internal = 0 x0008, /在符號或基位與數(shù)值之間補齊空格在符號或基位與數(shù)值之間補齊空格 dec = 0 x0010, /按十進制按十進制I/O oct = 0 x0020, /按八進制按八進制I/O hex = 0 x0040, /按十六進制按十六進制I/O showbase = 0 x0080, /輸出數(shù)制的基輸出數(shù)制的基 showpoint = 0 x0100, /強制浮點數(shù)輸出小數(shù)點強制浮點數(shù)輸出小數(shù)點 uppercase
14、= 0 x0200, /十六進制采用大寫輸出十六進制采用大寫輸出 showpos = 0 x0400, /在正數(shù)前加上在正數(shù)前加上“+” scientific = 0 x0800, /浮點數(shù)使用科學記數(shù)法浮點數(shù)使用科學記數(shù)法 fixed = 0 x1000, /浮點數(shù)使用普通記數(shù)法浮點數(shù)使用普通記數(shù)法 unitbuf = 0 x2000, /每次插入后刷新所有流每次插入后刷新所有流 stdio = 0 x4000 /每次插入后刷新標準輸出和標準錯誤輸出流每次插入后刷新標準輸出和標準錯誤輸出流;(1)setf() 成員函數(shù)成員函數(shù)setf()用于設置狀態(tài)標志。例如,設置輸用于設置狀態(tài)標志。例如,
15、設置輸出流出流cout的的showbase標志使用如下語句:標志使用如下語句: cout.setf(ios:showbase); 設置輸入流設置輸入流cin的的skipws標志使用如下語句:標志使用如下語句: cin.setf(ios:skipws); 注意:格式標志前的限定注意:格式標志前的限定“ios:”不可缺少,因不可缺少,因為這些標志是在為這些標志是在ios類中定義的。類中定義的。 在在setf()中還可用位或操作中還可用位或操作“|”將多個標志連在一將多個標志連在一起。例如:起。例如: cout.setf(ios:scientific|ios:showpoint); 同時設置同時設置
16、scientific和和showpoint兩個標志。兩個標志。(2)unsetf() 成員函數(shù)成員函數(shù)unsetf()用來取消格式標志,用來取消格式標志,unsetf()的的用法與用法與setf()相似。相似。(3)flags() 成員函數(shù)成員函數(shù)flags()用于獲取當前格式標志的狀態(tài),用于獲取當前格式標志的狀態(tài),即返回保護成員即返回保護成員x_flags的當前值。的當前值。(4)precision() 該函數(shù)的說明如下:該函數(shù)的說明如下: int precision(int num); 用于設置或返回(不帶參數(shù)時)浮點數(shù)的輸出精用于設置或返回(不帶參數(shù)時)浮點數(shù)的輸出精度,也就是通過這個公
17、共成員函數(shù)設置度,也就是通過這個公共成員函數(shù)設置ios類的保護類的保護數(shù)據(jù)成員數(shù)據(jù)成員x_precision的值,該成員的默認值為的值,該成員的默認值為6。 precision()函數(shù)的設置值一直有效,直到下一個函數(shù)的設置值一直有效,直到下一個precision()函數(shù)改變該值為止。函數(shù)改變該值為止。(5)width() 該函數(shù)的說明如下:該函數(shù)的說明如下: int width(int len); 用于設置或返回(不帶參數(shù)時)輸出數(shù)據(jù)的字段用于設置或返回(不帶參數(shù)時)輸出數(shù)據(jù)的字段寬度,也就是通過這個公共成員函數(shù)設置寬度,也就是通過這個公共成員函數(shù)設置ios類的保類的保護數(shù)據(jù)成員護數(shù)據(jù)成員x_
18、width的值。的值。 width()函數(shù)的設置值只對下一個輸出有效。函數(shù)的設置值只對下一個輸出有效。(6)fill() 該函數(shù)的說明如下:該函數(shù)的說明如下: char fill(char ch); 用于設置或返回(不帶參數(shù)時)輸出的填充字用于設置或返回(不帶參數(shù)時)輸出的填充字符,也就是通過這個公共成員函數(shù)設置符,也就是通過這個公共成員函數(shù)設置ios類的保護類的保護數(shù)據(jù)成員數(shù)據(jù)成員x_fill的值,該成員的默認值為空格。的值,該成員的默認值為空格。 fill ()函數(shù)的設置值一直有效,直到下一個函數(shù)的設置值一直有效,直到下一個fill()函數(shù)改變該值為止。函數(shù)改變該值為止。【例】【例】 分析
19、以下程序的執(zhí)行結果。分析以下程序的執(zhí)行結果。#include void main() int n=123; double d=1234.5678; cout.precision(10); cout.width(10); cout.fill(*); cout n endl; cout d endl; cout.precision(6); cout.width(6); cout n endl; cout d endl; *123 1234.5678 *123 1234.57 右對齊右對齊13.2.2 使用使用I/O操縱符操縱符 除除ios類成員函數(shù)之外,類成員函數(shù)之外,C+的流類庫還提供了另的流類
20、庫還提供了另一種更方便的一種更方便的I/O格式化方法,這種方法使用一種稱格式化方法,這種方法使用一種稱為操縱符的特殊函數(shù),操縱符的特點是可以直接包含為操縱符的特殊函數(shù),操縱符的特點是可以直接包含在在I/O表達式中。表達式中。 所有不帶形參的操縱符都定義在頭文件所有不帶形參的操縱符都定義在頭文件iostream.h中,而帶形參的操縱符則定義在頭文件中,而帶形參的操縱符則定義在頭文件iomanip.h中,因而使用相應的操縱符就必須包含相中,因而使用相應的操縱符就必須包含相應的頭文件。表應的頭文件。表13.3列出了這些列出了這些I/O操縱符。操縱符。 已在第已在第3章已介紹,這是不再討論。章已介紹,
21、這是不再討論。13.3 13.3 重載重載I/OI/O運算符運算符 C+的的I/O系統(tǒng)的另一個優(yōu)點是可以重載系統(tǒng)的另一個優(yōu)點是可以重載I/O運運算符。通過重載算符。通過重載I/O運算符,可以建立適合于類需運算符,可以建立適合于類需要的輸入和輸出界面。要的輸入和輸出界面。 I/O運算符重載的實質就是把用于變量輸入輸運算符重載的實質就是把用于變量輸入輸出的運算符轉化為對于類對象的輸入輸出操作。出的運算符轉化為對于類對象的輸入輸出操作。13.3.1 重載輸出運算符重載輸出運算符“” 在在C+中,輸出操作稱為插入,中,輸出操作稱為插入,“”稱為插入稱為插入運算符。當重載輸出運算符運算符。當重載輸出運算
22、符“”用于輸出時,相當用于輸出時,相當于創(chuàng)建一個插入符函數(shù)。插入符函數(shù)的格式如下:于創(chuàng)建一個插入符函數(shù)。插入符函數(shù)的格式如下: friend ostream & operator (ostream & stream,類名類名 & 類引用名類引用名) 函數(shù)體函數(shù)體; return stream; 該插入符函數(shù)是以友元方式說明的。其中的第一該插入符函數(shù)是以友元方式說明的。其中的第一個參數(shù)是個參數(shù)是ostream類對象的一個引用,即類對象的一個引用,即stream必須必須是一個輸出流。是一個輸出流。“類引用名類引用名”接收待輸出的對象。接收待輸出的對象。該函數(shù)返回該函數(shù)返回ostream的一個引用的
23、一個引用stream?!昂瘮?shù)體函數(shù)體”中給出實現(xiàn)該插入符重載目的的代碼。中給出實現(xiàn)該插入符重載目的的代碼?!纠俊纠?分析以下程序的執(zhí)行結果。分析以下程序的執(zhí)行結果。#include class Sample int x,y;public: Sample(int m,int n) x=m;y=n; friend ostream & operator (ostream & stream,Sample & s) cout x= s.x ,y= s.y endl; return stream; ;void main() Sample A(1,2),B(3,4); cout A ” 在在C+中,中,
24、“”運算符稱為提取運算符,對它進運算符稱為提取運算符,對它進行重載的函數(shù)稱為提取符函數(shù)。這個運算符函數(shù)接收行重載的函數(shù)稱為提取符函數(shù)。這個運算符函數(shù)接收流的輸入信息。其格式如下:流的輸入信息。其格式如下: friend istream & operator (istream & stream,類名類名 & 類引用名類引用名) 函數(shù)體函數(shù)體; return stream; 該提取符函數(shù)是以友元方式說明的。其中的第一該提取符函數(shù)是以友元方式說明的。其中的第一個參數(shù)是個參數(shù)是istream類對象的一個引用,即類對象的一個引用,即stream必須是必須是一個輸入流。一個輸入流?!邦愐妹愐妹苯邮?/p>
25、輸入對象的引用。該接收輸入對象的引用。該函數(shù)返回函數(shù)返回istream的一個引用的一個引用stream?!昂瘮?shù)體函數(shù)體”中給中給出實現(xiàn)該提取符重載目的的代碼。出實現(xiàn)該提取符重載目的的代碼?!纠俊纠?分析以下程序的執(zhí)行結果。分析以下程序的執(zhí)行結果。#include class Sample int x,y;public: Sample() friend istream & operator (istream & stream,Sample & s) cout 輸入輸入x和和y的值的值 endl; cout s.x; cout s.y; return stream; friend ostrea
26、m & operator (ostream & stream,Sample & s) cout 輸出輸出x和和y的值的值 endl; cout x= s.x ,y= s.y A; cout A; 輸入輸入x和和y的值的值 x:5 y:8 輸出輸出x和和y的值的值 x=5,y=813.4 13.4 檢測流操作的錯誤檢測流操作的錯誤 在在I/O流的操作過程中可能出現(xiàn)各種錯誤,每一個流的操作過程中可能出現(xiàn)各種錯誤,每一個流都有一個狀態(tài)標志字,以指示是否發(fā)生了錯誤以及流都有一個狀態(tài)標志字,以指示是否發(fā)生了錯誤以及出現(xiàn)了哪種類型的錯誤,這種處理技術與格式控制標出現(xiàn)了哪種類型的錯誤,這種處理技術與格式控制
27、標志字是相同的。志字是相同的。ios類定義了以下枚舉類型:類定義了以下枚舉類型: enum io_state goodbit =0 x00,/不設置任何位,一切正常不設置任何位,一切正常 eofbit =0 x01, /輸入流已經(jīng)結束,無字符可讀入輸入流已經(jīng)結束,無字符可讀入 failbit =0 x02, /上次讀上次讀/寫操作失敗,但流仍可使用寫操作失敗,但流仍可使用 badbit =0 x04, /試圖作無效的讀試圖作無效的讀/寫操作,流不再可用寫操作,流不再可用 hardfail=0 x80 /不可恢復的嚴重錯誤不可恢復的嚴重錯誤 ; 對應于這個標志字各狀態(tài)位,對應于這個標志字各狀態(tài)位
28、,ios類還提供了以下類還提供了以下成員函數(shù)來檢測或設置流的狀態(tài):成員函數(shù)來檢測或設置流的狀態(tài): int rdstate(); /返回流的當前狀態(tài)標志字返回流的當前狀態(tài)標志字 int eof(); /返回非返回非0值表示到達文件尾值表示到達文件尾 int fail(); /返回非返回非0值表示操作失敗值表示操作失敗 int bad(); /返回非返回非0值表示出現(xiàn)錯誤值表示出現(xiàn)錯誤 int good(); /返回非返回非0值表示流操作正常值表示流操作正常 int clear(int flag=0); /將流的狀態(tài)設置為將流的狀態(tài)設置為flag 為提高程序的可靠性,我們應在程序中檢測為提高程序的
29、可靠性,我們應在程序中檢測I/O流流的操作是否正常。當檢測到流操作出現(xiàn)錯誤時,可以的操作是否正常。當檢測到流操作出現(xiàn)錯誤時,可以通過異常處理來解決問題。通過異常處理來解決問題。13.5 13.5 文文 件件 流流 文件是存儲在磁盤、磁帶等外部設備上的數(shù)據(jù)集文件是存儲在磁盤、磁帶等外部設備上的數(shù)據(jù)集合,每一個文件都必須有一個惟一名字。合,每一個文件都必須有一個惟一名字。 使用文件前必須首先打開,使用完畢后必須關閉使用文件前必須首先打開,使用完畢后必須關閉文件。文件。 對文件的操作是由文件流類完成的。文件流類在對文件的操作是由文件流類完成的。文件流類在流與文件之間建立連接,使用這些文件流類必須用流
30、與文件之間建立連接,使用這些文件流類必須用#include編譯指令將頭文件編譯指令將頭文件fstream.h包含進來。包含進來。13.5.1 文件的打開與關閉文件的打開與關閉 流可以分為流可以分為3類:輸入流、輸出流以及輸入類:輸入流、輸出流以及輸入/輸出輸出流,相應地必須將流說明為流,相應地必須將流說明為ifstream、ofstream以及以及fstream類的對象。例如:類的對象。例如: ifstream ifile; /說明一個輸入流說明一個輸入流 ofstream ofile; /說明一個輸出流說明一個輸出流 fstream iofile; /說明說明個輸入個輸入/輸出流輸出流 說明
31、了流對象之后,可使用函數(shù)說明了流對象之后,可使用函數(shù)open()打開文件。打開文件。文件的打開即是在流與文件之間建立一個連接。文件的打開即是在流與文件之間建立一個連接。open()的函數(shù)原型為:的函數(shù)原型為: void open(const char * filename, int mode, int prot=filebuf:openprot); 其中,其中,filename是文件名字,它可包含路徑說明。是文件名字,它可包含路徑說明。 mode說明文件打開的模式,它對文件的操作影響說明文件打開的模式,它對文件的操作影響重大,重大,mode的取值必須是以下值之一:的取值必須是以下值之一: io
32、s:in 打開文件進行讀操作打開文件進行讀操作 ios:out 打開文件進行寫操作打開文件進行寫操作 ios:ate 打開時文件指針定位到文件尾打開時文件指針定位到文件尾 ios:app 添加模式,所有增加都在文件尾部進行添加模式,所有增加都在文件尾部進行 ios:trunc 如果文件已存在則清空原文件如果文件已存在則清空原文件 ios:nocreate 如果文件不存在則打開失敗如果文件不存在則打開失敗 ios:noreplace 如果文件存在則打開失敗如果文件存在則打開失敗 ios:binary 二進制文件(非文本文件)二進制文件(非文本文件) 對于對于ifstream流,流,mode的默認
33、值為的默認值為ios:in;對于;對于ofstream流,流,mode的默認值為的默認值為ios:out。 prot決定文件的訪問方式,取值如下:決定文件的訪問方式,取值如下: 0 普通文件普通文件 1 只讀文件只讀文件 2 隱含文件隱含文件 4 系統(tǒng)文件系統(tǒng)文件 一般情況下,該訪問方式使用默認值。一般情況下,該訪問方式使用默認值。 與其他狀態(tài)標志一樣,與其他狀態(tài)標志一樣,mode的符號常量可以用位的符號常量可以用位或運算或運算“|”組合在一起,如組合在一起,如ios:in|ios:binary表示以表示以只讀方式打開二進制文件。例如:只讀方式打開二進制文件。例如: ifstream ifil
34、e; ifile.open(c:vcabc.txt,ios:ate);表示以文本文件形式打開表示以文本文件形式打開C:vc目錄下的目錄下的abc.txt文件,文件,文件指針定位到文件尾,準備進行讀文件操作。而文件指針定位到文件尾,準備進行讀文件操作。而操作:操作: ofstream ofile; ofile.open(c:vcabc.txt,ios:binary);表示以二進制文件形式打開表示以二進制文件形式打開C:vc目錄下的目錄下的abc.txt文文件,準備進行寫文件操作。件,準備進行寫文件操作。 其中,文件名中其中,文件名中“”的第一個的第一個“”為轉義字符。為轉義字符。 除了除了ope
35、n()成員函數(shù)外,成員函數(shù)外,ifstream、ofstream和和fstream三類流的構造函數(shù)也可以打開文件,其參數(shù)同三類流的構造函數(shù)也可以打開文件,其參數(shù)同open()函數(shù)。例如:函數(shù)。例如: ifstream ifile(c:vcabc.txt ); 說明一個輸入流對象的同時,將這個流與文件說明一個輸入流對象的同時,將這個流與文件“c:vcabc.txt”連接起來,使流連接起來,使流ifile可以用文本形式對可以用文本形式對該文件進行讀操作。該文件進行讀操作。13.5.2 文件的讀寫文件的讀寫 通過打開文件就建立通過打開文件就建立I/O流與文本文件的連接,之流與文本文件的連接,之后就可
36、以進行文件的讀寫操作了。后就可以進行文件的讀寫操作了。1文件讀寫方法文件讀寫方法 在在C+中提供了幾種文件讀寫方法。中提供了幾種文件讀寫方法。 (1)使用流運算符直接讀寫。)使用流運算符直接讀寫。 文件的讀文件的讀/寫操作可以直接使用流的插入運算符寫操作可以直接使用流的插入運算符“”,這些運算符將完成文件,這些運算符將完成文件的字符轉換工作。的字符轉換工作。 (2)使用流成員函數(shù)。)使用流成員函數(shù)。 常用的輸出流成員函數(shù)如下:常用的輸出流成員函數(shù)如下: put函數(shù)函數(shù) 該函數(shù)把一個字符寫到輸出流中。下面該函數(shù)把一個字符寫到輸出流中。下面兩個語句默認是相同的,但第二個受該流的格式化參兩個語句默認
37、是相同的,但第二個受該流的格式化參數(shù)的影響:數(shù)的影響: cout.put(A); /精確地輸出一個字符精確地輸出一個字符 cout )很)很相似,主要的不同點是相似,主要的不同點是get函數(shù)在讀取數(shù)據(jù)時包括空白函數(shù)在讀取數(shù)據(jù)時包括空白字符,而提取運算符在默認情況下拒絕接受空白字符。字符,而提取運算符在默認情況下拒絕接受空白字符。 getline函數(shù)函數(shù) 該函數(shù)的功能是允許從輸入流中讀該函數(shù)的功能是允許從輸入流中讀取多個字符,并且允許指定輸入終止字符(默認值是取多個字符,并且允許指定輸入終止字符(默認值是換行字符),在讀取完成后,從讀取的內容中刪除該換行字符),在讀取完成后,從讀取的內容中刪除該
38、終止字符。終止字符。 read函數(shù)函數(shù) 該函數(shù)從一個文件讀字節(jié)到一個指定該函數(shù)從一個文件讀字節(jié)到一個指定的存儲器區(qū)域,由長度參數(shù)確定要讀的字節(jié)數(shù)。雖然的存儲器區(qū)域,由長度參數(shù)確定要讀的字節(jié)數(shù)。雖然給出長度參數(shù),但當遇到文件結束或者在文本模式文給出長度參數(shù),但當遇到文件結束或者在文本模式文件中遇到文件結束標記字符時讀就結束。件中遇到文件結束標記字符時讀就結束。2文本文件的讀寫文本文件的讀寫 文本文件只適用于那些解釋為文本文件只適用于那些解釋為ASCII碼的文件。碼的文件。處理文本文件時將自動作一些字符轉換,如輸出換處理文本文件時將自動作一些字符轉換,如輸出換行字符行字符0 x0A時將轉換為回車時
39、將轉換為回車0 x0D與換行與換行0 x0A兩個字兩個字符存入文本文件,讀入時也會將回車與換行兩個字符存入文本文件,讀入時也會將回車與換行兩個字符合并為一個換行字符,這樣內存中的字符與寫入符合并為一個換行字符,這樣內存中的字符與寫入文件中的字符之間就不再是一一對應關系。文件中的字符之間就不再是一一對應關系。 文本文件的結束以文本文件的結束以ASCII碼的控制字符碼的控制字符0 x1A表示。表示?!纠俊纠?分析以下程序的執(zhí)行結果。分析以下程序的執(zhí)行結果。#include #include int main() ofstream ofile(test); /打開打開test文件用于寫,即輸出文
40、件用于寫,即輸出 if (!ofile) cout test文件不能打開文件不能打開 endl; return 0; ofile This book is C+ 12345 endl; ofile.close(); ifstream ifile(test); /打開打開test文件用于讀,即輸入文件用于讀,即輸入 if (!ifile) cout test文件不能打開文件不能打開 str; ifile.close(); cout str endl; return 1; 本程序先在當前目錄下建立一本程序先在當前目錄下建立一個個test文本文件,并寫入文本文件,并寫入“This book is C
41、+ 12345”數(shù)據(jù),然后打數(shù)據(jù),然后打開該文件,將其中的數(shù)據(jù)輸入到開該文件,將其中的數(shù)據(jù)輸入到變量變量str中,由于讀時遇到空格時中,由于讀時遇到空格時終止,所以終止,所以str為為“This”。程序的。程序的執(zhí)行結果如下:執(zhí)行結果如下: This 【例】【例】 編寫一個程序,將文本文件編寫一個程序,將文本文件abc.txt復制到復制到文本文件文本文件xyz.txt。 解:使用輸入流成員函數(shù)解:使用輸入流成員函數(shù)get()從文本文件從文本文件abc.txt中讀取一個字符中讀取一個字符ch,然后使用輸出流成員函數(shù),然后使用輸出流成員函數(shù)put()將字符將字符ch寫入文本文件寫入文本文件xyz.
42、txt中,繼續(xù)這一過程直到中,繼續(xù)這一過程直到get()讀完為止。實現(xiàn)本例功能的程序如下:讀完為止。實現(xiàn)本例功能的程序如下:#include #include int main() ifstream ifile(abc.txt); char ch; if (!ifile) cout abc.txt文件不能打開文件不能打開 endl; return 0; ofstream ofile(xyz.txt); if (!ofile) cout xyz.txt文件不能打開文件不能打開 endl; return 0; while (ifile.get(ch) ofile.put(ch); ifile.cl
43、ose(); ofile.close(); return 1;3二進制文件的讀寫二進制文件的讀寫 二進制文件不同于文本文件,它可用于任何類二進制文件不同于文本文件,它可用于任何類型的文件(包括文本文件),讀寫二進制文件的字型的文件(包括文本文件),讀寫二進制文件的字符不作任何轉換,讀寫的字符與文件之間是完全一符不作任何轉換,讀寫的字符與文件之間是完全一致的。致的。 一般地,對二進制文件的讀寫可采用兩種方法:一般地,對二進制文件的讀寫可采用兩種方法:一種是使用一種是使用get()和和put();另一種是使用;另一種是使用read()和和write()。 【例】以下程序建立一個輸出文件流并將一個【
44、例】以下程序建立一個輸出文件流并將一個Date結構體變量的二進制值寫入到該文件中。結構體變量的二進制值寫入到該文件中。 #include struct Date int mo,da,yr; ; void main() Date dt=2,20,2001; ofstream ofile(data.dat,ios:binary); ofile.write(char *)&dt,sizeof dt); ofile.close(); 4文件的隨機讀寫文件的隨機讀寫 每一個文件都有兩個指針:一個是讀指針,說明每一個文件都有兩個指針:一個是讀指針,說明輸入操作當前在文件中的位置;另一個是寫指針,說輸入操作
45、當前在文件中的位置;另一個是寫指針,說明下次寫操作的當前位置。明下次寫操作的當前位置。 每次執(zhí)行輸入或輸出時,相應的讀每次執(zhí)行輸入或輸出時,相應的讀/寫指針將自寫指針將自動向后移動。動向后移動。 C+語言的文件流不僅可以按這種順序方式進行語言的文件流不僅可以按這種順序方式進行讀讀/寫,而且還可以隨機地移動文件的讀寫,而且還可以隨機地移動文件的讀/寫指針。有寫指針。有一些外部設備(如磁帶、行式打印機等)關聯(lián)的流只一些外部設備(如磁帶、行式打印機等)關聯(lián)的流只能作順序訪問,但在許多情況下使用隨機方式訪問文能作順序訪問,但在許多情況下使用隨機方式訪問文件更加方便靈活。件更加方便靈活。(1)輸出流隨機
46、訪問函數(shù))輸出流隨機訪問函數(shù) 輸出流隨機訪問函數(shù)有輸出流隨機訪問函數(shù)有seekp和和tellp。 一個輸出文件流保存一個內部指針以指出下一一個輸出文件流保存一個內部指針以指出下一次寫數(shù)據(jù)的位置。次寫數(shù)據(jù)的位置。seekp成員函數(shù)設置這個指針,因成員函數(shù)設置這個指針,因此可以以隨機方式向磁盤文件輸出。此可以以隨機方式向磁盤文件輸出。tellp成員函數(shù)返成員函數(shù)返回該文件位置指針值。這兩個成員函數(shù)的原型如下:回該文件位置指針值。這兩個成員函數(shù)的原型如下: ostream & ostream:seekp(流中的位置流中的位置); ostream & ostream:seekp(偏移量偏移量,參照位置
47、參照位置); streampos ostream:tellp(); 其中,其中,streampos被定義為被定義為long型,并以字節(jié)型,并以字節(jié)數(shù)為單位。數(shù)為單位?!皡⒄瘴恢脜⒄瘴恢谩本哂腥缦潞x:具有如下含義: cur=1 相對于當前寫指針所指定的位置。相對于當前寫指針所指定的位置。 beg=0 相對于流的開始位置。相對于流的開始位置。 end=2 相對于流的結尾處。相對于流的結尾處。(2)輸入流隨機訪問函數(shù)。)輸入流隨機訪問函數(shù)。 輸入流隨機訪問函數(shù)有輸入流隨機訪問函數(shù)有seekg和和tellg。 在輸入文件流中,保留著一個指向文件中下一在輸入文件流中,保留著一個指向文件中下一個將要讀數(shù)據(jù)的位置的內部指針,可以用個將要讀數(shù)據(jù)的位置的內部指針,可以用seekg函數(shù)函數(shù)來設置這個指針。使用來設置這個指針。使用seekg可以實現(xiàn)面向記錄的數(shù)可以實現(xiàn)面向記錄的數(shù)據(jù)管理系統(tǒng),用固定長度的記錄大小乘以記錄號便據(jù)管理系統(tǒng),用固定長度的記錄大小乘以記錄號便得到相對于文件末尾的字節(jié)位置,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 ISO/IEC 18584-2:2025 EN Information technology - Test methods for on-card biometric comparison applications - Part 2: Work-sharing mechanism
- 2025至2030中國益生菌補充品市場供應渠道與未來銷售渠道研究報告
- 2025至2030中國電子相冊軟件行業(yè)市場發(fā)展趨勢及有效策略與實施路徑評估報告
- 2025至2030中國電動牙鉆機行業(yè)深度研究及發(fā)展前景投資評估分析
- 2025至2030中國珩磨油行業(yè)深度研究及發(fā)展前景投資評估分析
- 2025至2030中國特殊需要的嬰兒車行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 教育心理學學生情感教育的核心
- 遼寧省沈文新高考研究聯(lián)盟2024-2025學年高一下學期7月期末質量監(jiān)測地理試卷(含答案)
- 華邦健康知識培訓
- 商業(yè)培訓中如何利用教育大數(shù)據(jù)提升教學效果
- 2024年09月年中國農(nóng)業(yè)發(fā)展銀行江蘇省分行秋季校園招聘(86人)筆試歷年參考題庫附帶答案詳解
- 2025年江蘇省揚州市中考作文4篇范文:“尊重”“誠實”“創(chuàng)造性”“美好生活”
- 2025年輔警招聘考試試題庫含完整答案
- 2025年吉林省中考語文試卷及答案
- 2024-2025學年度天津鐵道職業(yè)技術學院單招《語文》真題附答案詳解(突破訓練)
- 快遞行業(yè)市場發(fā)展分析及投資前景研究報告2025-2028版
- 《基本樂理》師范與學前教育專業(yè)基本樂理相關知識全套教學課件
- 2025年安徽省中考物理試題(原卷版)
- 2025-2026年中國臺球產(chǎn)業(yè)消費趨勢報告
- 2025年高考英語全國新高考II卷深度解讀及答案詳解
- 2025年第十屆“學憲法、講憲法”網(wǎng)絡知識競賽題庫(含答案)
評論
0/150
提交評論