第九章流類庫和輸入輸出(C程序設計(第2版)吳乃陵)

上傳人:仙*** 文檔編號:34301583 上傳時間:2021-10-21 格式:PPT 頁數(shù):21 大?。?60.02KB
收藏 版權(quán)申訴 舉報 下載
第九章流類庫和輸入輸出(C程序設計(第2版)吳乃陵)_第1頁
第1頁 / 共21頁
第九章流類庫和輸入輸出(C程序設計(第2版)吳乃陵)_第2頁
第2頁 / 共21頁
第九章流類庫和輸入輸出(C程序設計(第2版)吳乃陵)_第3頁
第3頁 / 共21頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《第九章流類庫和輸入輸出(C程序設計(第2版)吳乃陵)》由會員分享,可在線閱讀,更多相關《第九章流類庫和輸入輸出(C程序設計(第2版)吳乃陵)(21頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、第九章第九章 流類庫和輸入流類庫和輸入/ /輸出輸出文件是存儲在磁盤、磁帶等外部設備上數(shù)據(jù)集合,每文件是存儲在磁盤、磁帶等外部設備上數(shù)據(jù)集合,每一個文件都必須有一個唯一名字。使用文件前必須首先一個文件都必須有一個唯一名字。使用文件前必須首先打開文件,使用后必須關閉文件。對文件的操作時通過打開文件,使用后必須關閉文件。對文件的操作時通過文件流類完成的。文件流類在流與文件之間建立連接,文件流類完成的。文件流類在流與文件之間建立連接,使用這些文件流類必須用使用這些文件流類必須用#include 編譯指令將編譯指令將fstream.h包含進來包含進來。數(shù)據(jù)從一個對象到另一個對象的傳送被抽象為數(shù)據(jù)從一個

2、對象到另一個對象的傳送被抽象為“流流”。數(shù)據(jù)的輸入。數(shù)據(jù)的輸入/輸出就是通過輸入輸出就是通過輸入/輸出流來實現(xiàn)輸出流來實現(xiàn)的。的。 流是一種抽象的概念,負責在數(shù)據(jù)的產(chǎn)生者和數(shù)據(jù)流是一種抽象的概念,負責在數(shù)據(jù)的產(chǎn)生者和數(shù)據(jù)的使用者之間建立聯(lián)系,并管理數(shù)據(jù)的流動。的使用者之間建立聯(lián)系,并管理數(shù)據(jù)的流動。 9.1 C+的基本流類體系的基本流類體系流類體系:流類體系:以抽象類模板以抽象類模板ios為基類,流類模板派生體系見圖。整個為基類,流類模板派生體系見圖。整個流類模板體系的流類模板體系的標準標準I/O在頭文件在頭文件中說明,它包含頭文件中說明,它包含頭文件、和和。而輸入輸出。而輸入輸出文件流文件流

3、部分在頭文件部分在頭文件中說明。中說明。 主要輸入主要輸入/輸出流模板層次輸出流模板層次 iosstreambufistreamostreamifstreamiostreamofstreamfstream指針指針9.2 文件的輸入與輸文件的輸入與輸出出 本節(jié)中文件指的是磁盤文件。本節(jié)中文件指的是磁盤文件。C+根據(jù)文件(根據(jù)文件(file)內(nèi)容)內(nèi)容的數(shù)據(jù)格式,可分為兩類:二進制文件和文本文件。的數(shù)據(jù)格式,可分為兩類:二進制文件和文本文件。文本文文本文件件由字符序列組成,也稱由字符序列組成,也稱ASCII碼文件,在文本文件中存取碼文件,在文本文件中存取的最小信息單位為字符(的最小信息單位為字符(

4、character),而),而二進制文件二進制文件中存中存取的最小信息單位為字節(jié)(取的最小信息單位為字節(jié)(Byte)。)。C+把每一個文件都看成一個有序的字節(jié)流,見圖把每一個文件都看成一個有序的字節(jié)流,見圖9.2,每一個文件或者以文件結(jié)束符(每一個文件或者以文件結(jié)束符(end of file marker)結(jié)束,)結(jié)束,或者在特定的字節(jié)號處結(jié)束?;蛘咴谔囟ǖ淖止?jié)號處結(jié)束。 012436578n-1文件結(jié)束符文件結(jié)束符圖圖9.2 C+把文件看作有序的把文件看作有序的n個字節(jié)的流個字節(jié)的流文件的基本概念:文件的基本概念:9.2 文件的輸入與輸文件的輸入與輸出出當打開一個文件時,該文件就和某個流關聯(lián)

5、起來了。對文件進行讀當打開一個文件時,該文件就和某個流關聯(lián)起來了。對文件進行讀寫實際上受到一個寫實際上受到一個文件定位指針(文件定位指針(file position pointer)的控制。的控制。 輸入流的指針也稱為讀指針,每一次提取操作將從讀指針當前輸入流的指針也稱為讀指針,每一次提取操作將從讀指針當前所指位置開始,每次提取操作自動將讀指針向文件尾移動。所指位置開始,每次提取操作自動將讀指針向文件尾移動。 輸出流指針也稱寫指針,每一次插入操作將從寫指針當前位置輸出流指針也稱寫指針,每一次插入操作將從寫指針當前位置開始,每次插入操作自動將寫指針向文件尾移動。開始,每次插入操作自動將寫指針向文

6、件尾移動。9.2.1 文件的打開與關閉文件的打開與關閉 9.2.2 文本文件的讀寫文本文件的讀寫9.2.3 二進制文件的讀寫二進制文件的讀寫 9.2.4 文件的隨機訪問文件的隨機訪問9.2.1 文件的打開與關閉文件的打開與關閉文件使用步驟:文件使用步驟:1說明一個文件流對象,這又被稱為內(nèi)部文件:說明一個文件流對象,這又被稱為內(nèi)部文件:ifstream ifile;/只輸入用只輸入用ofstream ofile;/只輸出用只輸出用fstream iofile;/既輸入又輸出用既輸入又輸出用 2使用文件流對象的成員函數(shù)打開一個磁盤文件。這樣在文使用文件流對象的成員函數(shù)打開一個磁盤文件。這樣在文件流

7、對象和磁盤文件名之間建立聯(lián)系。文件流中說明了三個打件流對象和磁盤文件名之間建立聯(lián)系。文件流中說明了三個打開文件的成員函數(shù)。開文件的成員函數(shù)。void ifstream:open(const char*,int =ios:in, int=filebuf:openprot);void ofstream:open(const char *,int=ios:out, int=filebuf:opernprot);void fstream:open(const char*,int, int=filebuf:openprot); 第一個參數(shù)為要打開的磁盤文件名。第二個參數(shù)為打開方式,第一個參數(shù)為要打開的磁

8、盤文件名。第二個參數(shù)為打開方式,有輸入(有輸入(in),輸出(),輸出(out)等,打開方式在)等,打開方式在ios基類中定義為基類中定義為枚舉類型。第三個參數(shù)為指定打開文件的保護方式,一般取默枚舉類型。第三個參數(shù)為指定打開文件的保護方式,一般取默認。認。所以第二步可如下進行:所以第二步可如下進行:iofile.open(“myfile.txt”,ios:in|ios:out);文件打開方式文件打開方式: :是由在是由在ios類中定義的公有枚舉成員決定:類中定義的公有枚舉成員決定:enum open_mode in=0 x01,out=0 x02,ate=0 x04,app=0 x08,tru

9、nc=0 x10,binary=0 x80; ios:in ios:in 打開文件進行讀操作打開文件進行讀操作 ios:outios:out 打開文件進行寫操作打開文件進行寫操作 ios:ateios:ate 打開時文件指針定位到文件尾打開時文件指針定位到文件尾 ios:appios:app 添加模式,所有增加都在文件尾部進行添加模式,所有增加都在文件尾部進行 ios:truncios:trunc 如果文件已經(jīng)存在則清空源文件如果文件已經(jīng)存在則清空源文件 ios:nocreateios:nocreate 如果文件不存在則打開失敗如果文件不存在則打開失敗 ios:noreplaceios:nor

10、eplace 如果文件存在則打開失敗如果文件存在則打開失敗 ios:binaryios:binary 二進制文件(非文本文件)二進制文件(非文本文件)ModeMode的符號常量可以用位或運算的符號常量可以用位或運算| |組合在一起,如:組合在一起,如:ios:in|ios:binaryios:in|ios:binary 只讀方式打開二進制文件只讀方式打開二進制文件對于對于ifstreamifstream流,流,modemode默認方式是默認方式是ios;inios;in;對于對于ofstream流,流,mode默認默認方式是方式是ios;out;打開方式解釋:Port決定文件的訪問方式0 普通

11、文件 2 隱含文件1 只讀文件 4 系統(tǒng)文件 三個文件流類都重載了一個帶默認參數(shù)的三個文件流類都重載了一個帶默認參數(shù)的構(gòu)造函構(gòu)造函數(shù)數(shù),功能與,功能與open函數(shù)一樣:函數(shù)一樣:ifstream:ifstream(const char*, int=ios:in, int=filebuf:openprot);ofstream:ofstream(const char*,int=ios:out, int=filebuf:openprot);fstream:fstream(const char*,int, int=filebuf:operprot);所以所以1,2兩步可合成:兩步可合成:fstream

12、 iofile(”myfile.txt”,ios:in|ios:out);打開文件也應該判斷是否成功,若成功,文件流對打開文件也應該判斷是否成功,若成功,文件流對象值為非零值,不成功為象值為非零值,不成功為0(NULL),),文件流對象文件流對象值物理上就是指它的地址值物理上就是指它的地址。因此打開一個文件完整的程序為:因此打開一個文件完整的程序為:fstream iofile(”myfile.txt”,ios:in|ios:out);if(!iofile) cout”不能打開文件不能打開文件:”myfile.txt”endl;return -1; /失敗退回失敗退回使用使用提取提取和和插入運

13、算符插入運算符對文件進行讀寫操作,對文件進行讀寫操作,或使用或使用成員函數(shù)成員函數(shù)進行讀寫。進行讀寫。輸出流函數(shù)輸出流函數(shù): get readPut函數(shù)函數(shù) 該函數(shù)把一個字符寫到輸出流中。該函數(shù)把一個字符寫到輸出流中。 Cout相似,主要的不同點相似,主要的不同點get函數(shù)在讀取數(shù)據(jù)時函數(shù)在讀取數(shù)據(jù)時包括空白字符,而包括空白字符,而在默認情況下拒絕接受空白字符。在默認情況下拒絕接受空白字符。Write函數(shù)函數(shù) 該函數(shù)把內(nèi)存中的一塊內(nèi)容寫到一個輸出文件流中,長度參數(shù)指出寫的字該函數(shù)把內(nèi)存中的一塊內(nèi)容寫到一個輸出文件流中,長度參數(shù)指出寫的字節(jié)數(shù)。該函數(shù)遇到空字符時并不停止,因而能夠?qū)懭胪暾念惤Y(jié)構(gòu)

14、,該函數(shù)帶節(jié)數(shù)。該函數(shù)遇到空字符時并不停止,因而能夠?qū)懭胪暾念惤Y(jié)構(gòu),該函數(shù)帶2個參個參數(shù),一個數(shù),一個char型指針(指向內(nèi)存數(shù)據(jù)的起始地址)和一個所寫的字節(jié)數(shù)。型指針(指向內(nèi)存數(shù)據(jù)的起始地址)和一個所寫的字節(jié)數(shù)。注意在該注意在該結(jié)構(gòu)的對象地址之前要結(jié)構(gòu)的對象地址之前要char做強制類型轉(zhuǎn)換。做強制類型轉(zhuǎn)換。read函數(shù)函數(shù) 該函數(shù)從一個文件讀字節(jié)到一個指定的存儲器區(qū)域,由長度參數(shù)確定要讀該函數(shù)從一個文件讀字節(jié)到一個指定的存儲器區(qū)域,由長度參數(shù)確定要讀的字節(jié)數(shù)。雖然給出長度參數(shù),但當遇到文件結(jié)束或者在文本模式文件中遇到文件的字節(jié)數(shù)。雖然給出長度參數(shù),但當遇到文件結(jié)束或者在文本模式文件中遇到文

15、件結(jié)束標記時讀結(jié)束。結(jié)束標記時讀結(jié)束。關閉文件。三個文件流類各有一個關閉關閉文件。三個文件流類各有一個關閉文件的成員函數(shù)文件的成員函數(shù) :void ifstream:close();void ofstream:close();void fstream:close();使用很方便,如:使用很方便,如:iofile.close(); 關閉文件時,系統(tǒng)把該文件相關聯(lián)的文件緩沖關閉文件時,系統(tǒng)把該文件相關聯(lián)的文件緩沖區(qū)中的數(shù)據(jù)寫到文件中,保證文件的完整,收回與區(qū)中的數(shù)據(jù)寫到文件中,保證文件的完整,收回與該文件相關的內(nèi)存空間,可供再分配,把磁盤文件該文件相關的內(nèi)存空間,可供再分配,把磁盤文件名與文件流對

16、象之間的關聯(lián)斷開,可防止誤操作修名與文件流對象之間的關聯(lián)斷開,可防止誤操作修改了磁盤文件。如又要對文件操作必須重新打開。改了磁盤文件。如又要對文件操作必須重新打開。 關閉文件并沒有取消文件流對象,該文件流對關閉文件并沒有取消文件流對象,該文件流對象又可與其他磁盤文件建立聯(lián)系。文件流對象在程象又可與其他磁盤文件建立聯(lián)系。文件流對象在程序結(jié)束時,或它的生命期結(jié)束時,由析構(gòu)函數(shù)撤消。序結(jié)束時,或它的生命期結(jié)束時,由析構(gòu)函數(shù)撤消。它同時釋放內(nèi)部分配的預留緩沖區(qū)。它同時釋放內(nèi)部分配的預留緩沖區(qū)。 例1 分析以下程序的運行結(jié)果,對文本文件的讀寫直接使用插入運算符 和提取運算符#include #inclu

17、de int main() ofstream ofile(“test”); /打開打開test文件用于寫文件用于寫,即輸出即輸出 ofile.open() 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; / 與與get不同,不同, 遇到空格時結(jié)束遇到空格時結(jié)束 ifile.

18、close(); cout str endl; return 1;9.2.2 文本文件的讀寫文本文件的讀寫 int main() char ch; ifstream sfile(d:1.cpp); ofstream dfile(“d:2.cpp); /只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗 if(!sfile) cout不能打開源文件不能打開源文件:d:1.cppendl; return -1; if(!dfile) cout不能打開目標文件不能打開目標文件:“d:2.cppch) dfilech; sfile.close(); /如沒

19、有這兩個關閉函數(shù)如沒有這兩個關閉函數(shù),析構(gòu)函數(shù)也可關閉析構(gòu)函數(shù)也可關閉 dfile.close(); return 0;例2 分析以下程序的運行結(jié)果,例3 編寫一個程序,將文本文件abc.txt復制到文本文件xyz.txt解:使用輸入流成員函數(shù)get()從文本文件abc.txt中讀取一個字符ch,然后使用輸出流成員函數(shù)put()將字符ch寫入文本文件xyz.txt中,繼續(xù)這一過程直到get()讀完為止。程序如下:#include #include int main() ifstream ifile(abc.txt); if (!ifile) cout abc.txt文件不能打開文件不能打開 e

20、ndl; return 0; ofstream ofile(xyz.txt); if (!ofile) cout xyz.txt文件不能打開文件不能打開 endl; return 0; char ch; while (ifile.get(ch) ofile.put(ch); ifile.close(); ofile.close(); return 1;例例4 編寫一個程序建立一個輸出文件流,并將一個編寫一個程序建立一個輸出文件流,并將一個Date結(jié)構(gòu)體變量結(jié)構(gòu)體變量的二進制值寫到該文件中。的二進制值寫到該文件中。解:對二進制文件的讀寫可以采用解:對二進制文件的讀寫可以采用2種方法,一種是使用種

21、方法,一種是使用get()、()、put(),另一種是使用(),另一種是使用read()和()和write(),定義一個結(jié)構(gòu)體(),定義一個結(jié)構(gòu)體Date變量變量dt并初始化,通過并初始化,通過write語句將其寫入到文件語句將其寫入到文件data.dat中。中。程序如下:程序如下:#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();9.2.3

22、二進制文件的讀寫二進制文件的讀寫每一個文件都有兩個指針,一個是讀指針,指示輸入操作當前在文件每一個文件都有兩個指針,一個是讀指針,指示輸入操作當前在文件中的位置;另一個是寫指針,指示下次寫操作的當前位置。中的位置;另一個是寫指針,指示下次寫操作的當前位置。C+語言語言的文件不僅可以按這種順序方式進行讀的文件不僅可以按這種順序方式進行讀/寫,而且可以隨機地移動文寫,而且可以隨機地移動文件的讀寫指針。件的讀寫指針。(1)輸出流隨機訪問函數(shù)。)輸出流隨機訪問函數(shù)。 一個輸出文件流保存一個內(nèi)部指針以指出下一次寫數(shù)據(jù)的位置。一個輸出文件流保存一個內(nèi)部指針以指出下一次寫數(shù)據(jù)的位置。輸出流隨機訪問函數(shù)有輸出

23、流隨機訪問函數(shù)有seekp(下一次寫數(shù)據(jù)的位置)和(下一次寫數(shù)據(jù)的位置)和tellp返返回回seekp()函數(shù)指針值。函數(shù)指針值。 seekp(偏移量,參照位置偏移量,參照位置) beg=0, /文件開頭文件開頭 cur=1, /文件指針的當前位置文件指針的當前位置 end=2 /文件結(jié)尾文件結(jié)尾 偏移量:被定義為偏移量:被定義為long型,以字節(jié)數(shù)為單位。型,以字節(jié)數(shù)為單位。9.2.4 文件的隨機讀寫文件的隨機讀寫(2)輸入流隨機訪問函數(shù)。)輸入流隨機訪問函數(shù)。 在輸入流文件中,保留著一個指向文件中下一個將要讀數(shù)據(jù)的位置在輸入流文件中,保留著一個指向文件中下一個將要讀數(shù)據(jù)的位置的內(nèi)部指針,可

24、以用的內(nèi)部指針,可以用seekg(來設置這個指針)和(來設置這個指針)和tellg(返回當前文件讀(返回當前文件讀指針的位置)指針的位置)。seekg(偏移量,參照位置偏移量,參照位置) beg=0, /文件開頭文件開頭 cur=1, /文件指針的當前位置文件指針的當前位置 end=2 /文件結(jié)尾文件結(jié)尾 偏移量:被定義為偏移量:被定義為long型,以字節(jié)數(shù)為單位。型,以字節(jié)數(shù)為單位。使用使用seekg可以實現(xiàn)面向記錄的數(shù)據(jù)管理系統(tǒng),用固定長度的記錄大小乘可以實現(xiàn)面向記錄的數(shù)據(jù)管理系統(tǒng),用固定長度的記錄大小乘以記錄號便得到相對于文件頭的字節(jié)位置,然后使用以記錄號便得到相對于文件頭的字節(jié)位置,然

25、后使用get讀這個記錄。讀這個記錄。例例5 編寫一個程序,在文件編寫一個程序,在文件city.dat中輸入幾個城市的名字和區(qū)號,并根據(jù)用戶中輸入幾個城市的名字和區(qū)號,并根據(jù)用戶輸入的區(qū)號查找對應的城市。輸入的區(qū)號查找對應的城市。解:設計一個解:設計一個City類,用于數(shù)據(jù)處理。以讀寫方式打開文件類,用于數(shù)據(jù)處理。以讀寫方式打開文件City.dat,在其中寫入幾個城,在其中寫入幾個城市數(shù)據(jù),然后將讀指針移到文件頭,依次查找用戶輸入的區(qū)號,找到后顯示。程序如下:市數(shù)據(jù),然后將讀指針移到文件頭,依次查找用戶輸入的區(qū)號,找到后顯示。程序如下:例例6 編寫一個程序,在二進制文件編寫一個程序,在二進制文件data.dat中寫入中寫入3條記錄,顯示其內(nèi)容;然后條記錄,顯示其內(nèi)容;然后刪除第刪除第2條記錄,并顯示刪除記錄后的文件內(nèi)容。條記錄,并顯示刪除記錄后的文件內(nèi)容。解:解:C+不能直接刪除文件中的記錄,采用的方法是,先將記錄讀入到結(jié)構(gòu)數(shù)組不能直接刪除文件中的記錄,采用的方法是,先將記錄讀入到結(jié)構(gòu)數(shù)組stud中,中,然后再重寫入到然后再重寫入到data.dat文件中,這時不寫要刪除的內(nèi)容。程序如下:文件中,這時不寫要刪除的內(nèi)容。程序如下:

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!