apl08.應用對象:流_第1頁
apl08.應用對象:流_第2頁
apl08.應用對象:流_第3頁
apl08.應用對象:流_第4頁
apl08.應用對象:流_第5頁
已閱讀5頁,還剩79頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C+面向對象的程序設計面向對象的程序設計譚火彬譚火彬第八講第八講 應用對象應用對象:流對象:流對象College of Software, BUAACopyright 內容安排內容安排v文件和流文件和流vC+中流技術的實現中流技術的實現v利用流技術操作順序文件利用流技術操作順序文件v隨機存取文件隨機存取文件v標準輸入標準輸入/輸出流輸出流v流的錯誤處理流的錯誤處理College of Software, BUAACopyright 內容安排內容安排v文件和流文件和流vC+中流技術的實現中流技術的實現v利用流技術操作順序文件利用流技術操作順序文件v隨機存取文件隨機存取文件v標準輸入標準輸入/輸出

2、流輸出流v流的錯誤處理流的錯誤處理College of Software, BUAACopyright 數據如何存儲數據如何存儲v目前程序所使用數據都是存儲在變量中目前程序所使用數據都是存儲在變量中n變量存在內存中,是臨時的,程序運行結束變量存在內存中,是臨時的,程序運行結束后即消失,不能長期保存后即消失,不能長期保存n也不能直接顯示到屏幕上,或從鍵盤讀入也不能直接顯示到屏幕上,或從鍵盤讀入v數據需要長期保存數據需要長期保存n需要存儲到外部設備中,如硬盤、光盤、需要存儲到外部設備中,如硬盤、光盤、 U盤、軟盤、磁帶等盤、軟盤、磁帶等n不管什么設備,對于計算機而言,就是不管什么設備,對于計算機而

3、言,就是0、1的數據序列的數據序列n為了方便這些數據的存儲,引入文件為了方便這些數據的存儲,引入文件(file)的的概念來永久保存數據概念來永久保存數據College of Software, BUAACopyright 文件文件(file)v文件文件(file)n操作系統提供的對數據存儲和組織的方式操作系統提供的對數據存儲和組織的方式n將相關的數據按照一定的將相關的數據按照一定的格式格式存儲在一起,并通存儲在一起,并通過過進行訪問進行訪問(讀和寫讀和寫)n同時為了區分不同格式的文件,操作系統引入了同時為了區分不同格式的文件,操作系統引入了擴展名擴展名來表達不同的文件類型來表達不同的文件類型u

4、file1.txt、file2.doc、file3.jpg、file4.exen不同格式的文件訪問方式不同,一般需要通過專不同格式的文件訪問方式不同,一般需要通過專門的軟件,這些軟件按照文件的格式對文件中的門的軟件,這些軟件按照文件的格式對文件中的數據進行解釋數據進行解釋College of Software, BUAACopyright 文件的存儲文件的存儲v不同類型文件有不同的存儲和訪問策略不同類型文件有不同的存儲和訪問策略n文本、文本、Word、圖形、可執行文件、圖形、可執行文件v但計算機處理的所有數據最終都會被簡化成但計算機處理的所有數據最終都會被簡化成0和和1的序列的序列ntxt文件

5、:直接按照文件:直接按照ASCII 碼碼(或其它編碼或其它編碼)將字符將字符翻譯成二進制代碼翻譯成二進制代碼njpg文件:首先存儲圖片的基本信息文件:首先存儲圖片的基本信息(文件頭,包括文件頭,包括圖片大小、分辨率、壓縮算法等圖片大小、分辨率、壓縮算法等),再存儲具體的,再存儲具體的各像素的信息各像素的信息n可執行文件:文件頭可執行文件:文件頭+程序段程序段+數據段數據段n.College of Software, BUAACopyright 在程序中訪問文件在程序中訪問文件v流流(序列化序列化):文件是由文件是由0和和1組成的序列組成的序列n位位(b, bit):計算機所支持的最小數據項:計

6、算機所支持的最小數據項n字節字節(B, Byte):由:由8位組成,一般用來表示位組成,一般用來表示一個字符單位,一個字符單位,C+中的中的char類型類型v訪問訪問(讀取讀取)文件的基本思路文件的基本思路n把文件看成是一個字節流把文件看成是一個字節流n從該字節流中讀取若干個字節從該字節流中讀取若干個字節n按照文件格式,解釋所讀取的字節流,翻譯按照文件格式,解釋所讀取的字節流,翻譯成所需要的內容成所需要的內容 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 College of Software, BUAACopyright 示例:讀取文件示例:讀取文件 0 0 1 1 0 0

7、 0 1 0 0 1 1 0 0 1 0 College of Software, BUAACopyright 回顧:從回顧:從C到到C+的文件訪問技術的文件訪問技術v傳統傳統C的文件操作:的文件操作:stdio.h(cstdio)n操作系統提供的底層接口:操作系統提供的底層接口:int類型的句柄表示文類型的句柄表示文件,與之對應的件,與之對應的open、close、write、read、lseek等函數,實現對文件的操作等函數,實現對文件的操作n標準標準C提供的獨立于操作系統的接口:提供的獨立于操作系統的接口:FILE*結構,結構,與之對應的與之對應的fopen、fclose、fwrite、

8、fread、fprintf、fscanf、fgets、fgetc、fputc、feof、fseek等一些列等一些列對該結構操作的函數,實現對文件的操作對該結構操作的函數,實現對文件的操作v標準標準C+中引入流技術處理文件中引入流技術處理文件College of Software, BUAACopyright 總結:總結:C+文件操作核心技術文件操作核心技術v1. 如何建立與指定文件關聯的文件流,并從流如何建立與指定文件關聯的文件流,并從流中獲取內容中獲取內容n采用采用C+流技術,將文件與某一個流類關聯流技術,將文件與某一個流類關聯n從該流類中獲取指定的字節序列從該流類中獲取指定的字節序列v2.

9、 如何知道文件格式,并進行相應操作如何知道文件格式,并進行相應操作n每種類型的文件都有相關的格式標準,按照其標每種類型的文件都有相關的格式標準,按照其標準進行訪問準進行訪問n自定義的文件也需要有一定的格式,以便進行相自定義的文件也需要有一定的格式,以便進行相應的讀寫操作應的讀寫操作n格式不對,將可能帶來很嚴重的后果格式不對,將可能帶來很嚴重的后果u示例:文本文件示例:文本文件bugCollege of Software, BUAACopyright 內容安排內容安排v文件和流文件和流vC+中流技術的實現中流技術的實現v利用流技術操作順序文件利用流技術操作順序文件v隨機存取文件隨機存取文件v標準

10、輸入標準輸入/輸出流輸出流v流的錯誤處理流的錯誤處理College of Software, BUAACopyright C+中的流技術中的流技術vC+中,對數據的輸入中,對數據的輸入/輸出是以字節流輸出是以字節流的形式實現的的形式實現的n流實際上就是一個字節序列流實際上就是一個字節序列n輸入操作時,字節從輸入設備輸入操作時,字節從輸入設備(如鍵盤、磁如鍵盤、磁盤、網絡等盤、網絡等)流向內存流向內存n輸出操作時,字節從內存流向輸出設備輸出操作時,字節從內存流向輸出設備(如如顯示器、磁盤、網絡等顯示器、磁盤、網絡等)n應用程序對字節序列做出各種數據解釋,以應用程序對字節序列做出各種數據解釋,以A

11、SCII字符、內部格式的原始數據、圖形、字符、內部格式的原始數據、圖形、圖像、數字音頻、視頻或其它任何應用程序圖像、數字音頻、視頻或其它任何應用程序所需的信息所需的信息College of Software, BUAACopyright 字節流和雙字節流字節流和雙字節流v早期早期C+中,以字節為流的最小單位中,以字節為流的最小單位n英語字母、數字、特殊符號等都可以用一個字節英語字母、數字、特殊符號等都可以用一個字節來表示來表示(ASCII碼碼),在,在C+中表示為中表示為char類型,占類型,占一個字節空間一個字節空間v單字節最多只能表示單字節最多只能表示256(28)個字符,無法支持個字符,

12、無法支持一些大字符集一些大字符集n如:漢字的數量遠大于如:漢字的數量遠大于256個,一個漢字字符無法個,一個漢字字符無法通過單字節表示通過單字節表示vC+新引入一種占多個字節的字符類型,用于新引入一種占多個字節的字符類型,用于支持更大的字符集(如支持更大的字符集(如Unicode字符集)字符集)n數據類型數據類型wchar_t,占多個字節的,占多個字節的字符類型(兩個字符類型(兩個或四個或四個字節,取決于不同的編譯器)字節,取決于不同的編譯器)vC+的流技術也必須同時支持這兩種類型的流技術也必須同時支持這兩種類型College of Software, BUAACopyright 題外話:關于

13、字符編碼題外話:關于字符編碼vASCII編碼編碼n1 Byte,上世紀,上世紀60年代美國制定的一套字符編碼,年代美國制定的一套字符編碼,實現英文字符與二進制之間映射實現英文字符與二進制之間映射n一共規定了一共規定了128個字符編碼,最高為均為個字符編碼,最高為均為0v非非ASCII編碼編碼n利用最高位,這樣就可以表示利用最高位,這樣就可以表示256個字符個字符n如如130(0 x82)在法語中的表示在法語中的表示n但亞洲國家文字,使用的符號更多,漢字多達但亞洲國家文字,使用的符號更多,漢字多達10萬,就必須使用多個字節表達一個符號萬,就必須使用多個字節表達一個符號n簡體中文常見編碼方式是簡體

14、中文常見編碼方式是GB2312,使用兩個字節,使用兩個字節表示一個漢字,所以理論上最多可以表示表示一個漢字,所以理論上最多可以表示256x256=65536個符號個符號College of Software, BUAACopyright 題外話:關于字符編碼題外話:關于字符編碼(續續)vUnicoden以前,世界上存在多種編碼方式,同一二進制數以前,世界上存在多種編碼方式,同一二進制數字可被解釋成不同的符號。因此,要想打開一個字可被解釋成不同的符號。因此,要想打開一個文本文件,就必須知道它的編碼方式,否則用錯文本文件,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,出現亂碼誤的編碼方式解讀,

15、出現亂碼n建立一種編碼,將世界上所有符號都納入其中。建立一種編碼,將世界上所有符號都納入其中。每一個符號都給予一個獨一無二的編碼每一個符號都給予一個獨一無二的編碼nUnicode,就是一種所有符號的編碼,就是一種所有符號的編碼nUnicode是一個很大的集合,現在的規模可以容納是一個很大的集合,現在的規模可以容納100多萬個符號。每個符號的編碼都不一樣,如:多萬個符號。每個符號的編碼都不一樣,如:U+0639為阿拉伯字母為阿拉伯字母Ain,U+0041為英語的大寫為英語的大寫字母字母A,U+4E25為漢字為漢字“嚴嚴”College of Software, BUAACopyright 題外話

16、:關于字符編碼題外話:關于字符編碼(續續)vUTF-8nUnicode只是一個字符集,只規定了二進制代碼,只是一個字符集,只規定了二進制代碼,卻沒有規定該代碼如何存儲,不同的編碼需要不卻沒有規定該代碼如何存儲,不同的編碼需要不同的字節數同的字節數nUTF-8就是在互聯網上使用最廣的一種就是在互聯網上使用最廣的一種Unicode的的實現方式實現方式n基本編碼規則基本編碼規則u對于單字節的符號,字節的第一位設為對于單字節的符號,字節的第一位設為0,后面,后面7位為位為這個符號的這個符號的Unicode碼碼u對于英語字母,對于英語字母,UTF-8編碼和編碼和ASCII碼是相同的碼是相同的u對于對于n

17、字節的符號字節的符號(n1),第一個字節的前,第一個字節的前n位都設為位都設為1,第第n+1位設為位設為0,后面字節的前兩位一律設為,后面字節的前兩位一律設為10。剩下的。剩下的沒有提及的二進制位,全部為這個符號的沒有提及的二進制位,全部為這個符號的Unicode碼碼uUnicode碼和碼和UTF-8存儲之后的代碼并不一定相同存儲之后的代碼并不一定相同College of Software, BUAACopyright 示例:記事本支持的存儲方式示例:記事本支持的存儲方式vANSInANSI是默認的編碼方式是默認的編碼方式n對于英文文件是對于英文文件是ASCII編碼,對于簡體中文文件是編碼,對

18、于簡體中文文件是GB2312編碼編碼(只針對只針對Windows簡體中文版,如果是繁體中文版會采簡體中文版,如果是繁體中文版會采用用Big5碼碼)vUnicodenUCS-2編碼方式,即直接用兩個字節存入字符的編碼方式,即直接用兩個字節存入字符的Unicode碼碼n用用little endian格式格式(低位在前,高位在后低位在前,高位在后)vUnicode big endiannUnicode big endian編碼與上一個選項相對應編碼與上一個選項相對應n用用big endian格式格式(高位在前,低位在后高位在前,低位在后)vUTF-8nUTF-8編碼編碼College of Soft

19、ware, BUAACopyright C+中流技術實現思路中流技術實現思路vC+流技術實現了對字符流的操作流技術實現了對字符流的操作n字符流有單字節流,也可能是雙字節流;或字符流有單字節流,也可能是雙字節流;或者還有可能有別的形式編碼者還有可能有別的形式編碼n早期的早期的C+只支持單字節流只支持單字節流n對于不同類型流,其處理算法是類似的對于不同類型流,其處理算法是類似的n采用模板技術來實現整個流庫采用模板技術來實現整個流庫n不同種類的流不同種類的流(如輸入流、輸出流、文件流、如輸入流、輸出流、文件流、字符串流等字符串流等)的實現有相同也有不同,采用的實現有相同也有不同,采用繼承和多態設計整

20、個流庫繼承和多態設計整個流庫College of Software, BUAACopyright C+中流庫部分結構中流庫部分結構basic_iosbasic_istreambasic_ostreambasic_ifstreambasic_ofstreambasic_iostreambasic_fstreamCollege of Software, BUAACopyright C+中的流庫中的流庫v流庫提供的是操作各種流的類模板,在流庫提供的是操作各種流的類模板,在實際使用時需要實例化為模板類實際使用時需要實例化為模板類v如:輸入流如:輸入流basic_istream的定義為的定義為v定義一個

21、支持單字節的輸入流定義一個支持單字節的輸入流nbasic_istreamchar, char_traits cin;template typename Elem, typename Tr = char_traits class basic_istream : virtual public basic_ios College of Software, BUAACopyright 使用單字節字符流使用單字節字符流v平時使用更多的是單字節的字符流平時使用更多的是單字節的字符流n采用采用typedef定義一個類型替換符號定義一個類型替換符號n對于單字節流均可使用替換后符號對于單字節流均可使用替換后符號

22、uios、istream、ostream、ifstream、iostream、ofstream、fstreamu這種方式又保證了和早期的這種方式又保證了和早期的C+的兼容性的兼容性n對于多字節流,分別定義了相應的對于多字節流,分別定義了相應的w開頭開頭的的替換符號替換符號uwios、wistream、wostreamtypedef basic_istreamchar, char_traits istream; College of Software, BUAACopyright 核心頭文件核心頭文件viostreamn包含操作所有輸入包含操作所有輸入/輸出所需的基本信息輸出所需的基本信息n含有

23、含有cin、cout、cerr、clog等標準流對象,提供無等標準流對象,提供無格式和格式化的格式和格式化的I/O操作操作viomanipn包含格式化包含格式化I/O操作算子,用于指定數據輸入輸出操作算子,用于指定數據輸入輸出格式格式vfstreamn處理文件信息,包括建立文件、讀處理文件信息,包括建立文件、讀/寫文件的各種寫文件的各種操作接口操作接口vstrstreamn處理字符串流處理字符串流College of Software, BUAACopyright 內容安排內容安排v文件和流文件和流vC+中流技術的實現中流技術的實現v利用流技術操作順序文件利用流技術操作順序文件v隨機存取文件隨

24、機存取文件v標準輸入標準輸入/輸出流輸出流v流的錯誤處理流的錯誤處理College of Software, BUAACopyright 文件流文件流 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 ifstreamfstreamofstream-內內存-College of Software, BUAACopyright 文件操作過程文件操作過程v文件操作的基本步驟文件操作的基本步驟n1. 打開文件打開文件n2. 讀讀/寫文件寫文件n3. 關閉文件關閉文件College of Software, BUAACopyright 打開文件打開文件v主要完成的工作主要完成的工作n建立

25、文件流對象建立文件流對象n與外部文件建立關聯,并指定文件打開方式與外部文件建立關聯,并指定文件打開方式v兩種打開方法兩種打開方法n采用缺省構造函數建立流對象,再打開文件采用缺省構造函數建立流對象,再打開文件u流類流類 對象名對象名;u對象名對象名.open(文件名文件名, 打開方式打開方式)n利用帶參數的構造函數,建立對象同時打開文件利用帶參數的構造函數,建立對象同時打開文件u流類流類 對象名對象名(文件名文件名, 打開方式打開方式)College of Software, BUAACopyright open函數原型函數原型College of Software, BUAACopyright

26、 打開文件示例打開文件示例College of Software, BUAACopyright 打開文件后需要進行錯誤處理打開文件后需要進行錯誤處理v文件是程序之外的外部因素,無法控制,有很文件是程序之外的外部因素,無法控制,有很多因素可能導致無法打開文件多因素可能導致無法打開文件n磁盤損壞,無法訪問文件磁盤損壞,無法訪問文件n磁盤空間滿,不能創建新文件磁盤空間滿,不能創建新文件n文件只讀,不能以寫的方式打開文件文件只讀,不能以寫的方式打開文件n文件不存在,不能以讀的方式打開文件文件不存在,不能以讀的方式打開文件nv打開文件后如何判讀是否成功打開文件后如何判讀是否成功n!操作:操作:if (!

27、file)errornis_open()成員函數:成員函數:if (!file.is_open() errorCollege of Software, BUAACopyright 關閉文件關閉文件v主要完成的工作主要完成的工作n將緩沖區數據完整地寫入文件將緩沖區數據完整地寫入文件u流對象存儲在內存中,程序中對流對象操作時并不保流對象存儲在內存中,程序中對流對象操作時并不保證更新磁盤中的文件證更新磁盤中的文件n添加文件結束標志添加文件結束標志n切斷流對象和外部文件的連接切斷流對象和外部文件的連接v如果對象作用域沒有結束,則可以重用如果對象作用域沒有結束,則可以重用n利用該對象可以重新打開新的文件

28、利用該對象可以重新打開新的文件v流對象作用域結束,系統會自動關閉文件流對象作用域結束,系統會自動關閉文件v關閉方法關閉方法n對象名對象名.close()College of Software, BUAACopyright 關于文件的分類關于文件的分類v文本文件文本文件n所有的文件都是二進制的,但有些文件內容是由一行行的所有的文件都是二進制的,但有些文件內容是由一行行的可打印文本字符組成;為了處理方便,將其看做文本文件,可打印文本字符組成;為了處理方便,將其看做文本文件,并提供相關的類來操作并提供相關的類來操作n一般采用順序存取方式(從前往后讀),可看作順序文件一般采用順序存取方式(從前往后讀)

29、,可看作順序文件n以文本流方式進行操作,可利用運算符以文本流方式進行操作,可利用運算符操作文件操作文件n不同操作系統文本文件的格式不盡相同不同操作系統文本文件的格式不盡相同v二進制文件二進制文件n以基本類型數據在內存的二進制表示形式存放數據以基本類型數據在內存的二進制表示形式存放數據n讀寫方式由程序控制讀寫方式由程序控制n用用ios:binary方式打開方式打開n可隨機存取,又稱隨機存取文件可隨機存取,又稱隨機存取文件College of Software, BUAACopyright 創建并寫入順序文件創建并寫入順序文件v寫入文件操作是對文件的輸出操作,采寫入文件操作是對文件的輸出操作,采用

30、文件輸出流:用文件輸出流:ofstreamn默認的打開方式為默認的打開方式為ios:out,可以省略,可以省略v寫入文件時一定要注意文件格式控制寫入文件時一定要注意文件格式控制n文件本身沒有格式文件本身沒有格式n但為了以后的讀取操作,不同的數據要注意但為了以后的讀取操作,不同的數據要注意采用適當的分隔符采用適當的分隔符u通常一個邏輯記錄用換行符分隔,數據項之間通常一個邏輯記錄用換行符分隔,數據項之間可用空白符、換行符、制表符分隔可用空白符、換行符、制表符分隔College of Software, BUAACopyright 示例示例: 創建并寫入順序文件創建并寫入順序文件bool creat

31、eSequentialFile(const char *fileName)ofstream outClientFile(fileName, ios:out);if (!outClientFile) return false;int account; char name 30 ; double balance;cout AccounttNametBalance;coutaccountnamebalance)outClientFile account name balance n;cout? ;return true;College of Software, BUAACopyright 讀取順序文

32、件讀取順序文件v讀取文件操作是從文件中的輸入操作,讀取文件操作是從文件中的輸入操作,采用文件輸如流:采用文件輸如流:ifstreamn默認的打開方式為默認的打開方式為ios:in,可以省略,可以省略v讀取文件時一定要按照文件格式讀取讀取文件時一定要按照文件格式讀取n按照寫入時的格式讀取文件,并存入到相應按照寫入時的格式讀取文件,并存入到相應的變量中的變量中College of Software, BUAACopyright 示例示例: 讀取順序文件讀取順序文件bool readSequentialFile(const char *fileName) ifstream inClientFile(

33、 fileName, ios:in ); if ( !inClientFile ) return false; int account; char name 30 ; double balance; cout account namebalance) outputLine( account, name, balance ); return true;College of Software, BUAACopyright 更新順序文件更新順序文件v順序文件的更新非常復雜順序文件的更新非常復雜n很難準確定位到某條特定的記錄很難準確定位到某條特定的記錄n由于每存入的一條記錄按照實際的字符數寫入到由于每

34、存入的一條記錄按照實際的字符數寫入到文件中,而這些記錄的大小千差萬別,這樣它們文件中,而這些記錄的大小千差萬別,這樣它們所占的空間也不相同所占的空間也不相同n修改一條記錄時,其所占空間可能發生變化修改一條記錄時,其所占空間可能發生變化u如果空間增加,則需要把后面的記錄往后移如果空間增加,則需要把后面的記錄往后移u如果空間減少,則需要把后面的記錄往前移如果空間減少,則需要把后面的記錄往前移v需要頻繁更新文件一般采用二機制格式存儲,需要頻繁更新文件一般采用二機制格式存儲,采用隨機存儲策略采用隨機存儲策略College of Software, BUAACopyright 順序文件示例:學生成績管理

35、系統順序文件示例:學生成績管理系統v功能需求功能需求n記錄學生的成績信息,主要包括:學號、姓記錄學生的成績信息,主要包括:學號、姓名和成績名和成績n能夠長期保存,即保存為一個文件能夠長期保存,即保存為一個文件n能夠瀏覽已有的學生成績信息能夠瀏覽已有的學生成績信息College of Software, BUAACopyright 學生類學生類class Studentpublic:Student(int num=0, char* n=, int sc=0) :number(num),score(sc) strcpy(name, n); int getNumber()const return n

36、umber;const char* getName()const return name;int getScore()const return score;private:int number;char name30;int score;College of Software, BUAACopyright 重載的輸出流重載的輸出流ostream& operator( output, const Student &s)outputs.getNumber()ts.getName()ts.getScore()close();8.delete outfile;College of Software,

37、BUAACopyright 內容安排內容安排v文件和流文件和流vC+中流技術的實現中流技術的實現v利用流技術操作順序文件利用流技術操作順序文件v隨機存取文件隨機存取文件v標準輸入標準輸入/輸出流輸出流v流的錯誤處理流的錯誤處理College of Software, BUAACopyright 從順序文件到隨機存取文件從順序文件到隨機存取文件v順序文件缺點順序文件缺點n難以定位某條記錄難以定位某條記錄n難以更新難以更新v關鍵文件是每條記錄的大小不一致,而關鍵文件是每條記錄的大小不一致,而且各個字段的類型不同且各個字段的類型不同v引入隨機存取文件引入隨機存取文件n每條記錄大小相同每條記錄大小相同

38、n不考慮各字段的數據類型,直接以二進制格不考慮各字段的數據類型,直接以二進制格式存儲式存儲(二進制文件二進制文件)College of Software, BUAACopyright 隨機存取文件示意圖隨機存取文件示意圖v隨機存取文件隨機存取文件n每條記錄大小相同,并以一個整體寫入文件每條記錄大小相同,并以一個整體寫入文件n記錄的查找、更新、插入等操作易于實現記錄的查找、更新、插入等操作易于實現College of Software, BUAACopyright 如何滿足隨機文件的存取要求如何滿足隨機文件的存取要求v對于文本文件,主要采用流運算符進行操作,對于文本文件,主要采用流運算符進行操作

39、,讀取和寫入時按實際字符數寫入讀取和寫入時按實際字符數寫入nostream outfile(“file.dat”); int number;outfilenumber;n對于對于4字節整數,最少可能占字節整數,最少可能占1位,最多可占位,最多可占11位位v對于二進制文件,采用無格式方式寫入,不考對于二進制文件,采用無格式方式寫入,不考慮數據類型和顯示,采用慮數據類型和顯示,采用write函數函數noutfile.write(reinterpret_cast(&number), sizeof(number);n一般根據文件的格式要求,定義不同的結構一般根據文件的格式要求,定義不同的結構(類類)作

40、作為一個整體來讀寫數據為一個整體來讀寫數據College of Software, BUAACopyright 輸出流常見操作輸出流常見操作v類類ostream提供了格式化輸出和無格式化提供了格式化輸出和無格式化輸出的功能輸出的功能College of Software, BUAACopyright 輸出流的操作說明輸出流的操作說明v輸出流輸出流write函數函數n把內存中的一塊內容寫到一個輸出文件流中,把內存中的一塊內容寫到一個輸出文件流中,長度參數指出寫的字節數長度參數指出寫的字節數v輸出流的輸出流的put函數函數n把一個字符寫到輸出流中把一個字符寫到輸出流中v輸出流輸出流seekp和和t

41、ellp函數函數n一個輸出文件流保存一個內部指針指出下一一個輸出文件流保存一個內部指針指出下一次寫數據的位置次寫數據的位置nseekp設置這個指針設置這個指針ntellp返回該文件位置返回該文件位置College of Software, BUAACopyright 輸入流常見操作輸入流常見操作College of Software, BUAACopyright 輸入流的操作說明輸入流的操作說明v輸入流的輸入流的getline函數函數n從輸入流中讀取多個字符從輸入流中讀取多個字符n可以指定輸入終止字符可以指定輸入終止字符n讀取完成后讀取完成后,從讀取內容中刪除該終止字符從讀取內容中刪除該終止字

42、符v輸入流的輸入流的read函數函數n從文件讀字節到指定的存儲器區域從文件讀字節到指定的存儲器區域n所讀字節數由長度參數確定所讀字節數由長度參數確定v輸入流的輸入流的seekg和和tellg函數函數nseekg用來設置指向文件中下一次將讀數據的位置用來設置指向文件中下一次將讀數據的位置的內部指針的內部指針ntellg返回當前文件位置返回當前文件位置College of Software, BUAACopyright 關于文件定位關于文件定位v有兩個與文件相聯系的指針,用于定位文件當前的有兩個與文件相聯系的指針,用于定位文件當前的位置位置n讀指針,輸入操作在文件中的位置讀指針,輸入操作在文件中的

43、位置n寫指針,下次寫操作的位置寫指針,下次寫操作的位置n每次執行輸入或輸出時,相應的指針自動變化每次執行輸入或輸出時,相應的指針自動變化vC+中對應的成員函數是中對應的成員函數是 seekg()和和 seekp()nistream &seekg(streamoff offset, seek_dir origin);u設置讀位置,設置讀位置,tellg獲取當前讀位置獲取當前讀位置nostream &seekp(streamoff offset, seek_dir origin);u設置寫位置,設置寫位置,tellp獲取當前寫位置獲取當前寫位置nstreamoff定義于定義于iostream 中,

44、定義有偏移量中,定義有偏移量 offset 所能取所能取得的最大值得的最大值nseek_dir表示移動的基準位置,是一個枚舉表示移動的基準位置,是一個枚舉uios:beg (文件開頭文件開頭),ios:cur (文件當前位置文件當前位置)、ios:end(文件結尾文件結尾)College of Software, BUAACopyright 示例:書庫管理系統示例:書庫管理系統v為某書店設計并實現一個書庫管理系統,為某書店設計并實現一個書庫管理系統,包括如下功能包括如下功能n新書入庫新書入庫n修改庫存信息修改庫存信息n查詢某本圖書的庫存信息查詢某本圖書的庫存信息n瀏覽當前庫存情況瀏覽當前庫存情

45、況College of Software, BUAACopyright 基本設計方案基本設計方案-1v1. 定義有關圖書信息的結構,用于作為定義有關圖書信息的結構,用于作為一個整體對二進制文件進行讀寫一個整體對二進制文件進行讀寫n可以用類,但一般習慣用結構,主要是將相可以用類,但一般習慣用結構,主要是將相應的數據項寫入文件應的數據項寫入文件/記錄圖書信息的結構體記錄圖書信息的結構體typedef structint key; /圖書編號圖書編號char name50;/圖書名稱圖書名稱int stocks;/庫存量庫存量 CBook;College of Software, BUAACopyr

46、ight 基本設計方案基本設計方案-2v2. 設計操作存取圖書文件相關的類,實設計操作存取圖書文件相關的類,實現對文件的各種操作現對文件的各種操作class CBookFile public:bool Add(const CBook &book);/增加圖書增加圖書bool Modify(const CBook &book);/修改圖書修改圖書bool Find(int key, CBook *book) const;/查詢圖書查詢圖書bool FindFirst(CBook *book) const;/查詢第一本圖書查詢第一本圖書bool FindNext(CBook *book) cons

47、t;/查詢下一本圖書查詢下一本圖書CBookFile(const string& _fileName); /構造函數,打開文件構造函數,打開文件virtual CBookFile();/析構函數,關閉文件析構函數,關閉文件private: string fileName; /存儲圖書信息的文件名存儲圖書信息的文件名fstream *file; /操作文件的文件流操作文件的文件流;College of Software, BUAACopyright 圖書文件類的關鍵代碼的實現圖書文件類的關鍵代碼的實現-1v構造函數中打開文件構造函數中打開文件v析構函數中關閉文件析構函數中關閉文件file= ne

48、w fstream();file-open(fileName.c_str(), ios:binary|ios:in|ios:out);if ( !file-is_open() )/判斷文件是否成功打開判斷文件是否成功打開cerrclose();/釋放文件流釋放文件流delete file;College of Software, BUAACopyright 圖書文件類的關鍵代碼的實現圖書文件類的關鍵代碼的實現-2v查找第一本圖書查找第一本圖書FindFirstbool CBookFile:FindFirst(CBook *book) constfile-clear(); /清除之前可能遺留的相

49、關標記清除之前可能遺留的相關標記file-seekg(0, ios:beg); /將讀指針移到文件頭將讀指針移到文件頭if(file-eof() return false;/文件結束,則返回文件結束,則返回else /在當前位置讀出在當前位置讀出CBook大小的一塊字節流,將其存入大小的一塊字節流,將其存入book結構中結構中file-read(reinterpret_cast(book), sizeof(CBook);if (!file-fail() & (file-gcount()=sizeof(CBook)/如果文如果文件流沒出錯,且讀到整個圖書結構所需內容件流沒出錯,且讀到整個圖書結構

50、所需內容return true;else return false;College of Software, BUAACopyright 圖書文件類的關鍵代碼的實現圖書文件類的關鍵代碼的實現-3v查找下一本圖書查找下一本圖書FindNextbool CBookFile:FindNext(CBook *book) const if(file-eof() return false;/如果文件結束,則返回空如果文件結束,則返回空else/在當前位置讀出在當前位置讀出CBook大小的一塊字節流大小的一塊字節流file-read(reinterpret_cast(book), sizeof(CBook)

51、;if (!file-fail() & (file-gcount()=sizeof(CBook)/如果文件流沒出錯,并且讀到了圖書結構所需要數量的內容如果文件流沒出錯,并且讀到了圖書結構所需要數量的內容return true;else return false;College of Software, BUAACopyright 圖書文件類的關鍵代碼的實現圖書文件類的關鍵代碼的實現-4v查找指定的某本圖書查找指定的某本圖書Findbool CBookFile:Find(int key, CBook *book) constCBook temp;if (FindFirst(&temp)/如果有第

52、一本書如果有第一本書 while(temp.key!=key)/如果沒有找到所要的書,則繼續找如果沒有找到所要的書,則繼續找 if (!FindNext(&temp)/如果查找下一本出錯,則返回如果查找下一本出錯,則返回return false; /找到了圖書,進行內存空間的拷貝,將找到了圖書,進行內存空間的拷貝,將temp值賦給值賦給bookmemcpy(reinterpret_cast(book), reinterpret_cast(&temp), sizeof(CBook);return true;else return false;College of Software, BUAACo

53、pyright 圖書文件類的關鍵代碼的實現圖書文件類的關鍵代碼的實現-4v增加一本圖書增加一本圖書Addbool CBookFile:Add(const CBook &book)/首先查找是否有重復的主鍵首先查找是否有重復的主鍵key,如果重復則不能追加,如果重復則不能追加 CBook book1; if(Find(book.key, &book1) return false; /清除文件結束位標記,防止后面的操作無法進行清除文件結束位標記,防止后面的操作無法進行 file-clear(); /將文件寫指針移到文件末尾,在文件的最后追加新紀錄將文件寫指針移到文件末尾,在文件的最后追加新紀錄 f

54、ile-seekp(0, ios:end); /將圖書信息寫入文件將圖書信息寫入文件 file-write(reinterpret_cast(&book), sizeof(CBook); /返回操作狀態表示是否寫入成功返回操作狀態表示是否寫入成功 return !(file-fail();College of Software, BUAACopyright 圖書文件類的關鍵代碼的實現圖書文件類的關鍵代碼的實現-5v修改某本指定的圖書信息修改某本指定的圖書信息Modifybool CBookFile:Modify(const CBook &book)CBook book1;if(!Find(bo

55、ok.key, &book1) return false; /找到了當前記錄,則需將文件寫指針移到當前記錄的位置,找到了當前記錄,則需將文件寫指針移到當前記錄的位置, /目前讀指針已經移到了當前記錄的下一個記錄的位置,目前讀指針已經移到了當前記錄的下一個記錄的位置, /因此寫指針的位置應是當前讀指針位置減掉當前記錄的大小因此寫指針的位置應是當前讀指針位置減掉當前記錄的大小 file-seekp(file-tellg()-static_cast(sizeof(CBook), ios:beg); file-write(reinterpret_cast(&book), sizeof(CBook);

56、/返回操作狀態表示是否修改成功返回操作狀態表示是否修改成功 return !(file-fail();College of Software, BUAACopyright 基本設計方案基本設計方案-3v3. 設計與用戶交互的操作界面,封裝成設計與用戶交互的操作界面,封裝成一個獨立的類一個獨立的類class CBookConsole public:void Run();/運行控制臺運行控制臺void Modify();/修改圖書界面修改圖書界面void Add();/增加圖書界面增加圖書界面void Find() const;/查詢圖書的界面查詢圖書的界面void List() const; /

57、顯示所有圖書信息的界面顯示所有圖書信息的界面int DisplayMenu() const;/顯示系統主菜單顯示系統主菜單CBookConsole(const char *fileName=bookFiles.dat);virtual CBookConsole();private:CBookFile *bf;/文件操作對象文件操作對象;College of Software, BUAACopyright 基本設計方案基本設計方案-4v4. 編寫主函數,啟動系統操作界面編寫主函數,啟動系統操作界面#include BookConsole.hint main()/指定文件路徑,啟動控制臺界面指定文

58、件路徑,啟動控制臺界面CBookConsole bc(books.dat);/運行控制臺,進入控制臺內部處理運行控制臺,進入控制臺內部處理bc.Run();return 0;College of Software, BUAACopyright 內容安排內容安排v文件和流文件和流vC+中流技術的實現中流技術的實現v利用流技術操作順序文件利用流技術操作順序文件v隨機存取文件隨機存取文件v標準輸入標準輸入/輸出流輸出流v流的錯誤處理流的錯誤處理College of Software, BUAACopyright 標準輸入輸出流和流操作標準輸入輸出流和流操作v標準流是標準流是C+預定義的對象,提供內存

59、外部設備進行預定義的對象,提供內存外部設備進行數據交互功能數據交互功能n流操作是對流類的公有成員函數的調用流操作是對流類的公有成員函數的調用vC+預定義預定義4個流類對象,即個流類對象,即cin、cout、cerr和和clog標準流類標準流類對象對象,當,當C+程序開始執行時,這程序開始執行時,這4個對象個對象就被構造好,且不能被應用程序析構就被構造好,且不能被應用程序析構nextern istream cin; /對應標準輸入設備對應標準輸入設備nextern ostream cout; /對應標準輸出設備對應標準輸出設備nextern ostream cerr; /對應標準錯誤設備對應標準

60、錯誤設備nextern ostream clog; /對應標準錯誤設備對應標準錯誤設備College of Software, BUAACopyright 輸入輸出流輸入輸出流vcin: 輸入流輸入流(istream)對象,對應設備是對象,對應設備是鍵盤,可以重定向鍵盤,可以重定向vcout:輸出流:輸出流(ostream)對象,對應設備對象,對應設備是屏幕,可以重定向是屏幕,可以重定向vcerr:輸出流:輸出流(ostream)對象,對應設備對象,對應設備是屏幕,非緩沖輸出,不能重定向是屏幕,非緩沖輸出,不能重定向vclog:輸出流:輸出流(ostream)對象,對應設備對象,對應設備是打印

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論