第10章對(duì)文件的輸入輸出2_第1頁(yè)
第10章對(duì)文件的輸入輸出2_第2頁(yè)
第10章對(duì)文件的輸入輸出2_第3頁(yè)
第10章對(duì)文件的輸入輸出2_第4頁(yè)
第10章對(duì)文件的輸入輸出2_第5頁(yè)
已閱讀5頁(yè),還剩92頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 精熟一技,拔萃萬(wàn)眾精熟一技,拔萃萬(wàn)眾C程序設(shè)計(jì)與實(shí)訓(xùn)程序設(shè)計(jì)與實(shí)訓(xùn)2home back first prev next last10.1 文件基本知識(shí)文件基本知識(shí)10.2 打開(kāi)與關(guān)閉文件打開(kāi)與關(guān)閉文件10.3 順序讀寫(xiě)數(shù)據(jù)文件順序讀寫(xiě)數(shù)據(jù)文件10.4 隨機(jī)讀寫(xiě)數(shù)據(jù)文件隨機(jī)讀寫(xiě)數(shù)據(jù)文件10.5 文件讀寫(xiě)的出錯(cuò)檢測(cè)文件讀寫(xiě)的出錯(cuò)檢測(cè)3home back first prev next last10.1.1 什么是文件什么是文件10.1.2 文件名文件名10.1.3 文件的分類文件的分類10.1.4 文件緩沖區(qū)文件緩沖區(qū)10.1.5 文件類型指針文件類型指針4home back first pre

2、v next last 文件有不同的類型,在程序設(shè)計(jì)中,主要文件有不同的類型,在程序設(shè)計(jì)中,主要用到兩種文件:用到兩種文件:(1) 程序文件程序文件。包括。包括源程序文件源程序文件(后綴為后綴為.c)、目標(biāo)目標(biāo)文件文件(后綴為后綴為.obj)、可執(zhí)行文件可執(zhí)行文件(后綴為后綴為.exe)等。等。這種文件的內(nèi)容是程序代碼。這種文件的內(nèi)容是程序代碼。5home back first prev next last 文件有不同的類型,在程序設(shè)計(jì)中,主要文件有不同的類型,在程序設(shè)計(jì)中,主要用到兩種文件:用到兩種文件:(2) 數(shù)據(jù)文件數(shù)據(jù)文件。文件的內(nèi)容不是程序,而是供程。文件的內(nèi)容不是程序,而是供程序運(yùn)

3、行時(shí)讀寫(xiě)的數(shù)據(jù),如在程序運(yùn)行過(guò)程中輸序運(yùn)行時(shí)讀寫(xiě)的數(shù)據(jù),如在程序運(yùn)行過(guò)程中輸出到磁盤(pán)出到磁盤(pán)(或其他外部設(shè)備或其他外部設(shè)備)的數(shù)據(jù),或在程序的數(shù)據(jù),或在程序運(yùn)行過(guò)程中供讀入的數(shù)據(jù)。如一批學(xué)生的成績(jī)運(yùn)行過(guò)程中供讀入的數(shù)據(jù)。如一批學(xué)生的成績(jī)數(shù)據(jù),或貨物交易的數(shù)據(jù)等。數(shù)據(jù),或貨物交易的數(shù)據(jù)等。 本章主要討論的是本章主要討論的是數(shù)據(jù)文件數(shù)據(jù)文件6home back first prev next last 在以前各章中所處理的數(shù)據(jù)的輸入和輸出在以前各章中所處理的數(shù)據(jù)的輸入和輸出,從終端的鍵盤(pán)輸入數(shù)據(jù),運(yùn)行結(jié)果輸出到從終端的鍵盤(pán)輸入數(shù)據(jù),運(yùn)行結(jié)果輸出到終端顯示器上終端顯示器上 常常需要將一些數(shù)據(jù)輸出到磁

4、盤(pán)上保存起常常需要將一些數(shù)據(jù)輸出到磁盤(pán)上保存起來(lái),以后來(lái),以后使用使用 這就要用到磁盤(pán)文件這就要用到磁盤(pán)文件7home back first prev next last 操作系統(tǒng)把各種設(shè)備都統(tǒng)一作為文件處理操作系統(tǒng)把各種設(shè)備都統(tǒng)一作為文件處理 從操作系統(tǒng)的角度看,每一個(gè)與主機(jī)相聯(lián)從操作系統(tǒng)的角度看,每一個(gè)與主機(jī)相聯(lián)的輸入輸出設(shè)備都看作是文件。例如,的輸入輸出設(shè)備都看作是文件。例如, 終端鍵盤(pán)是輸入文件終端鍵盤(pán)是輸入文件 顯示屏和打印機(jī)是輸出文件顯示屏和打印機(jī)是輸出文件8home back first prev next last “文件文件”指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)

5、的集合 一批數(shù)據(jù)是以文件的形式存放在外部介質(zhì)上的一批數(shù)據(jù)是以文件的形式存放在外部介質(zhì)上的 操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理 想找存放在外部介質(zhì)上的數(shù)據(jù),先按文件名找想找存放在外部介質(zhì)上的數(shù)據(jù),先按文件名找到所指定的文件,然后再?gòu)脑撐募x數(shù)據(jù)到所指定的文件,然后再?gòu)脑撐募x數(shù)據(jù) 要向外部介質(zhì)上存儲(chǔ)數(shù)據(jù)也必須先建立一個(gè)文要向外部介質(zhì)上存儲(chǔ)數(shù)據(jù)也必須先建立一個(gè)文件(以文件名作為標(biāo)志),才能向它輸出數(shù)據(jù)件(以文件名作為標(biāo)志),才能向它輸出數(shù)據(jù)9home back first prev next last 輸入輸出是數(shù)據(jù)傳送的過(guò)程,數(shù)據(jù)如流水輸入輸出是數(shù)據(jù)傳送的過(guò)

6、程,數(shù)據(jù)如流水一樣從一處流向另一處,因此常將輸入輸一樣從一處流向另一處,因此常將輸入輸出形象地稱為流出形象地稱為流(stream),即數(shù)據(jù)流。流表,即數(shù)據(jù)流。流表示了信息從源到目的端的流動(dòng)。示了信息從源到目的端的流動(dòng)。10home back first prev next last 輸入操作時(shí),數(shù)據(jù)從文件流向計(jì)算機(jī)內(nèi)存輸入操作時(shí),數(shù)據(jù)從文件流向計(jì)算機(jī)內(nèi)存 輸出操作時(shí),數(shù)據(jù)從計(jì)算機(jī)流向文件輸出操作時(shí),數(shù)據(jù)從計(jì)算機(jī)流向文件 無(wú)論是用無(wú)論是用Word打開(kāi)或保存文件,還是打開(kāi)或保存文件,還是C程程序中的輸入輸出都是通過(guò)操作系統(tǒng)進(jìn)行的序中的輸入輸出都是通過(guò)操作系統(tǒng)進(jìn)行的 “流流”是一個(gè)傳輸通道,數(shù)據(jù)可以

7、從運(yùn)行是一個(gè)傳輸通道,數(shù)據(jù)可以從運(yùn)行環(huán)境流入程序中,或從程序流至運(yùn)行環(huán)境環(huán)境流入程序中,或從程序流至運(yùn)行環(huán)境11home back first prev next last 從從C程序的觀點(diǎn)來(lái)看,無(wú)論程序一次讀寫(xiě)一程序的觀點(diǎn)來(lái)看,無(wú)論程序一次讀寫(xiě)一個(gè)字符,或一行文字,或一個(gè)指定的數(shù)據(jù)個(gè)字符,或一行文字,或一個(gè)指定的數(shù)據(jù)區(qū),作為輸入輸出的各種文件或設(shè)備都是區(qū),作為輸入輸出的各種文件或設(shè)備都是統(tǒng)一以統(tǒng)一以邏輯數(shù)據(jù)流邏輯數(shù)據(jù)流的方式出現(xiàn)的。語(yǔ)言的方式出現(xiàn)的。語(yǔ)言把文件看作是一個(gè)字符把文件看作是一個(gè)字符(或字節(jié))(或字節(jié))的序列。的序列。一個(gè)輸入輸出流就是一個(gè)字符流或字節(jié)一個(gè)輸入輸出流就是一個(gè)字符流或

8、字節(jié)(內(nèi)內(nèi)容為二進(jìn)制數(shù)據(jù)容為二進(jìn)制數(shù)據(jù))流。流。12home back first prev next last 的數(shù)據(jù)文件由一連串的字符(或字節(jié))的數(shù)據(jù)文件由一連串的字符(或字節(jié))組成,而不考慮行的界限,兩行數(shù)據(jù)間不組成,而不考慮行的界限,兩行數(shù)據(jù)間不會(huì)自動(dòng)加分隔符,對(duì)文件的存取是以字符會(huì)自動(dòng)加分隔符,對(duì)文件的存取是以字符(字節(jié))為單位的。輸入輸出數(shù)據(jù)流的開(kāi)(字節(jié))為單位的。輸入輸出數(shù)據(jù)流的開(kāi)始和結(jié)束僅受程序控制而不受物理符號(hào)始和結(jié)束僅受程序控制而不受物理符號(hào)(如回車換行符)控制,這就增加了處理(如回車換行符)控制,這就增加了處理的靈活性。這種文件稱為的靈活性。這種文件稱為流式文件流式文件。

9、13home back first prev next last 文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶識(shí)別和引用。識(shí)別和引用。 文件標(biāo)識(shí)包括三部分:文件標(biāo)識(shí)包括三部分:(1)文件路徑文件路徑(2)文件名主干文件名主干(3)文件后綴文件后綴14home back first prev next last 文件路徑表示文件在外部存儲(chǔ)設(shè)備中的位文件路徑表示文件在外部存儲(chǔ)設(shè)備中的位置。如:置。如: D: CCtempfile1.dat 表示表示file1.dat文件存放在文件存放在D盤(pán)中的盤(pán)中的CC目錄下的目錄下的temp子目錄下面子目錄下面文件路徑文件路徑文件名主

10、干文件名主干文件后綴文件后綴15home back first prev next last 文件路徑表示文件在外部存儲(chǔ)設(shè)備中的位文件路徑表示文件在外部存儲(chǔ)設(shè)備中的位置。如:置。如: D: CCtempfile1.dat 表示表示file1.dat文件存放在文件存放在D盤(pán)中的盤(pán)中的CC目錄下的目錄下的temp子目錄下面子目錄下面文件名文件名16home back first prev next last 文件路徑表示文件在外部存儲(chǔ)設(shè)備中的位文件路徑表示文件在外部存儲(chǔ)設(shè)備中的位置。如:置。如: D: CCtempfile1.dat 表示表示file1.dat文件存放在文件存放在D盤(pán)中的盤(pán)中的CC

11、目錄下的目錄下的temp子目錄下面子目錄下面命名規(guī)則遵循標(biāo)命名規(guī)則遵循標(biāo)識(shí)符的命名規(guī)則識(shí)符的命名規(guī)則17home back first prev next last 文件路徑表示文件在外部存儲(chǔ)設(shè)備中的位文件路徑表示文件在外部存儲(chǔ)設(shè)備中的位置。如:置。如: D: CCtempfile1.dat 表示表示file1.dat文件存放在文件存放在D盤(pán)中的盤(pán)中的CC目錄下的目錄下的temp子目錄下面子目錄下面一般不超過(guò)一般不超過(guò)3個(gè)字母?jìng)€(gè)字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)等)18home back first prev next last 根據(jù)數(shù)據(jù)的組織形式,數(shù)

12、據(jù)文件可分為根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為ASCII文件文件和和二進(jìn)制文件二進(jìn)制文件。 數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存儲(chǔ)的,如果不數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存儲(chǔ)的,如果不加轉(zhuǎn)換地輸出到外存,就是加轉(zhuǎn)換地輸出到外存,就是二進(jìn)制文件二進(jìn)制文件 如果要求在外存上以如果要求在外存上以ASCII代碼形式存儲(chǔ),則需代碼形式存儲(chǔ),則需要在存儲(chǔ)前進(jìn)行轉(zhuǎn)換要在存儲(chǔ)前進(jìn)行轉(zhuǎn)換 ASCII文件又稱文本文件,每一個(gè)字節(jié)放一個(gè)字文件又稱文本文件,每一個(gè)字節(jié)放一個(gè)字符的符的ASCII代碼代碼19home back first prev next last 字符一律以字符一律以ASCII形式存儲(chǔ)形式存儲(chǔ) 數(shù)值型數(shù)據(jù)既可以

13、用數(shù)值型數(shù)據(jù)既可以用ASCII形式存儲(chǔ),也可形式存儲(chǔ),也可以用二進(jìn)制形式存儲(chǔ)以用二進(jìn)制形式存儲(chǔ) 如有整數(shù)如有整數(shù)10000,如果用,如果用ASCII碼形式輸出到磁碼形式輸出到磁盤(pán),則在磁盤(pán)中占個(gè)字節(jié)盤(pán),則在磁盤(pán)中占個(gè)字節(jié)(每一個(gè)字符占一每一個(gè)字符占一個(gè)字節(jié)個(gè)字節(jié)),而用二進(jìn)制形式輸出,則在磁盤(pán)上,而用二進(jìn)制形式輸出,則在磁盤(pán)上只占只占4個(gè)字節(jié)個(gè)字節(jié)(用用VC+ C時(shí)時(shí))20home back first prev next last0011000100110000001100000011000000110000(1)(0)(0)(0)(0)ASCII形式形式000000000000000000

14、10011100010000二進(jìn)制形式二進(jìn)制形式(10000)21home back first prev next last ANSI C標(biāo)準(zhǔn)采用標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)緩沖文件系統(tǒng)”處理數(shù)處理數(shù)據(jù)文件據(jù)文件 所謂所謂緩沖文件系統(tǒng)緩沖文件系統(tǒng)是指系統(tǒng)自動(dòng)地在內(nèi)存是指系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為程序中每一個(gè)正在使用的文件開(kāi)辟一區(qū)為程序中每一個(gè)正在使用的文件開(kāi)辟一個(gè)文件緩沖區(qū)個(gè)文件緩沖區(qū)22home back first prev next last 從內(nèi)存向磁盤(pán)輸出數(shù)據(jù)必須先送到內(nèi)存中從內(nèi)存向磁盤(pán)輸出數(shù)據(jù)必須先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤(pán)的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤(pán)去去 如果從

15、磁盤(pán)向計(jì)算機(jī)讀入數(shù)據(jù),則一次從如果從磁盤(pán)向計(jì)算機(jī)讀入數(shù)據(jù),則一次從磁盤(pán)文件將一批數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)磁盤(pán)文件將一批數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再?gòu)木彌_區(qū)逐個(gè)地(充滿緩沖區(qū)),然后再?gòu)木彌_區(qū)逐個(gè)地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(給程序變量)將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(給程序變量)23home back first prev next last程序數(shù)據(jù)區(qū)程序數(shù)據(jù)區(qū)輸出文件緩沖區(qū)輸出文件緩沖區(qū)輸入文件緩沖區(qū)輸入文件緩沖區(qū)磁盤(pán)磁盤(pán)從內(nèi)存向磁盤(pán)輸出數(shù)據(jù)從內(nèi)存向磁盤(pán)輸出數(shù)據(jù)裝滿緩沖區(qū)裝滿緩沖區(qū)24home back first prev next last程序數(shù)據(jù)區(qū)程序數(shù)據(jù)區(qū)輸出文件緩沖區(qū)輸出文件緩沖區(qū)輸入文

16、件緩沖區(qū)輸入文件緩沖區(qū)磁盤(pán)磁盤(pán)從磁盤(pán)向計(jì)算機(jī)讀入數(shù)據(jù)從磁盤(pán)向計(jì)算機(jī)讀入數(shù)據(jù)充滿緩沖區(qū)充滿緩沖區(qū)25home back first prev next last 緩沖文件系統(tǒng)中,關(guān)鍵的概念是緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類文件類型指針型指針”,簡(jiǎn)稱,簡(jiǎn)稱“文件指針文件指針” 每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟一個(gè)相應(yīng)的每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的有關(guān)信息(如文文件信息區(qū),用來(lái)存放文件的有關(guān)信息(如文件的名字、文件狀態(tài)及文件當(dāng)前位置等)件的名字、文件狀態(tài)及文件當(dāng)前位置等) 這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型

17、是由系統(tǒng)聲明的,取名為構(gòu)體類型是由系統(tǒng)聲明的,取名為FILE26home back first prev next last 聲明聲明FILE結(jié)構(gòu)體類型的信息包含在頭文件結(jié)構(gòu)體類型的信息包含在頭文件“stdio.h”中中 一般一般設(shè)置一個(gè)指向設(shè)置一個(gè)指向FILE類型變量的指針變類型變量的指針變量,然后通過(guò)它來(lái)引用這些量,然后通過(guò)它來(lái)引用這些FILE類型變量類型變量27home back first prev next lastFILE*fp1,*fp2,*fp3;文件文件f1的的文件信息區(qū)文件信息區(qū)fp1文件文件f2的的文件信息區(qū)文件信息區(qū)fp2文件文件f3的的文件信息區(qū)文件信息區(qū)fp328h

18、ome back first prev next last10.2.1 用用fopen函數(shù)打開(kāi)數(shù)據(jù)文件函數(shù)打開(kāi)數(shù)據(jù)文件10.2.2 用用fclose函數(shù)關(guān)閉數(shù)據(jù)文件函數(shù)關(guān)閉數(shù)據(jù)文件29home back first prev next last 對(duì)文件讀寫(xiě)之前應(yīng)該對(duì)文件讀寫(xiě)之前應(yīng)該“打開(kāi)打開(kāi)”該文件,在該文件,在使用結(jié)束之后應(yīng)使用結(jié)束之后應(yīng)“關(guān)閉關(guān)閉”該文件。該文件。 所謂所謂“打開(kāi)打開(kāi)”是指為文件建立相應(yīng)的信息是指為文件建立相應(yīng)的信息區(qū)區(qū)(用來(lái)存放有關(guān)文件的信息用來(lái)存放有關(guān)文件的信息)和文件緩沖和文件緩沖區(qū)區(qū)(用來(lái)暫時(shí)存放輸入輸出的數(shù)據(jù)用來(lái)暫時(shí)存放輸入輸出的數(shù)據(jù))。30home back f

19、irst prev next last 在編寫(xiě)程序時(shí),在打開(kāi)文件的同時(shí),一般在編寫(xiě)程序時(shí),在打開(kāi)文件的同時(shí),一般都指定一個(gè)指針變量指向該文件,也就是都指定一個(gè)指針變量指向該文件,也就是建立起指針變量與文件之間的聯(lián)系,這樣建立起指針變量與文件之間的聯(lián)系,這樣就可以通過(guò)該指針變量對(duì)文件進(jìn)行讀寫(xiě)就可以通過(guò)該指針變量對(duì)文件進(jìn)行讀寫(xiě) 所謂所謂“關(guān)閉關(guān)閉”是指撤銷文件信息區(qū)和文件是指撤銷文件信息區(qū)和文件緩沖區(qū)緩沖區(qū) 31home back first prev next last fopen函數(shù)的調(diào)用方式為:函數(shù)的調(diào)用方式為:fopen(文件名文件名,使用文件方式使用文件方式); 例如:例如: fopen

20、(“a1”,”r”); 表示要打開(kāi)名為表示要打開(kāi)名為“a1”的文件,使用文件方的文件,使用文件方式為式為“讀入讀入” fopen函數(shù)的返回值是指向函數(shù)的返回值是指向a1文件的指針文件的指針32home back first prev next last 通常將通常將fopen函數(shù)的返回值賦給一個(gè)指向文函數(shù)的返回值賦給一個(gè)指向文件的指針變量。如:件的指針變量。如:FILE *fp; fp=fopen(“a1”,”r”); fp和文件和文件a1相聯(lián)系,相聯(lián)系,fp指向了指向了a1文件文件33home back first prev next last 在打開(kāi)一個(gè)文件時(shí),通知編譯系統(tǒng)以下在打開(kāi)一個(gè)文

21、件時(shí),通知編譯系統(tǒng)以下3個(gè)信息:個(gè)信息:需要訪問(wèn)的文件的名字需要訪問(wèn)的文件的名字使用文件的方式(使用文件的方式(“讀讀”還是還是“寫(xiě)寫(xiě)”等)等)讓哪一個(gè)指針變量指向被打開(kāi)的文件讓哪一個(gè)指針變量指向被打開(kāi)的文件 使用文件方式使用文件方式參參見(jiàn)見(jiàn)教材教材表表10.1。34home back first prev next last 說(shuō)明:說(shuō)明:(1) 用用“r”方式打開(kāi)的文件只能用于向計(jì)算機(jī)輸方式打開(kāi)的文件只能用于向計(jì)算機(jī)輸入而不能用作向該文件輸出數(shù)據(jù),而且該文入而不能用作向該文件輸出數(shù)據(jù),而且該文件應(yīng)該已經(jīng)存在,并存有數(shù)據(jù),這樣程序才件應(yīng)該已經(jīng)存在,并存有數(shù)據(jù),這樣程序才能從文件中讀數(shù)據(jù)。能從文

22、件中讀數(shù)據(jù)。 不能用不能用“r”方式打開(kāi)一個(gè)并不存在的文件,方式打開(kāi)一個(gè)并不存在的文件,否則出錯(cuò)。否則出錯(cuò)。35home back first prev next last 說(shuō)明:說(shuō)明:(2) 用用“w”方式打開(kāi)的文件只能用于向該文件方式打開(kāi)的文件只能用于向該文件寫(xiě)數(shù)據(jù)(即輸出文件),而不能用來(lái)向計(jì)算寫(xiě)數(shù)據(jù)(即輸出文件),而不能用來(lái)向計(jì)算機(jī)輸入。機(jī)輸入。 如果原來(lái)不存在該文件,則在打開(kāi)文件前新如果原來(lái)不存在該文件,則在打開(kāi)文件前新建立一個(gè)以指定的名字命名的文件。建立一個(gè)以指定的名字命名的文件。 如果原來(lái)已存在一個(gè)以該文件名命名的文件,如果原來(lái)已存在一個(gè)以該文件名命名的文件,則在打開(kāi)文件前先將該

23、文件刪去,然后重新則在打開(kāi)文件前先將該文件刪去,然后重新建立一個(gè)新文件。建立一個(gè)新文件。36home back first prev next last 說(shuō)明:說(shuō)明:(3) 如果希望向文件末尾添加新的數(shù)據(jù)(不希望如果希望向文件末尾添加新的數(shù)據(jù)(不希望刪除原有數(shù)據(jù)),則應(yīng)該用刪除原有數(shù)據(jù)),則應(yīng)該用“a”方式打開(kāi)方式打開(kāi) 但此時(shí)應(yīng)保證該文件已存在;否則將得到出但此時(shí)應(yīng)保證該文件已存在;否則將得到出錯(cuò)信息。錯(cuò)信息。 打開(kāi)文件時(shí),文件讀寫(xiě)標(biāo)記移到文件末尾打開(kāi)文件時(shí),文件讀寫(xiě)標(biāo)記移到文件末尾37home back first prev next last 說(shuō)明:說(shuō)明:(4) 用用r+、w+、a+方式打

24、開(kāi)的文件既可以用來(lái)輸方式打開(kāi)的文件既可以用來(lái)輸入數(shù)據(jù),也可以用來(lái)輸出數(shù)據(jù)。入數(shù)據(jù),也可以用來(lái)輸出數(shù)據(jù)。 用用r+方式時(shí)該文件應(yīng)該已經(jīng)存在。方式時(shí)該文件應(yīng)該已經(jīng)存在。 用用w+方式則新建立一個(gè)文件,先向此文件寫(xiě)方式則新建立一個(gè)文件,先向此文件寫(xiě)數(shù)據(jù),然后可以讀此文件中的數(shù)據(jù)。數(shù)據(jù),然后可以讀此文件中的數(shù)據(jù)。 用用a+方式打開(kāi)的文件,原來(lái)的文件不被刪去,方式打開(kāi)的文件,原來(lái)的文件不被刪去,文件讀寫(xiě)位置標(biāo)記移到文件末尾,可以添加,文件讀寫(xiě)位置標(biāo)記移到文件末尾,可以添加,也可以讀。也可以讀。38home back first prev next last 說(shuō)明:說(shuō)明:(5) 如果打開(kāi)如果打開(kāi)失敗失敗,

25、fopen函數(shù)將會(huì)帶回一個(gè)出錯(cuò)函數(shù)將會(huì)帶回一個(gè)出錯(cuò)信息。信息。fopen函數(shù)將帶回一個(gè)空指針值函數(shù)將帶回一個(gè)空指針值NULL 常用下面的方法打開(kāi)一個(gè)文件:常用下面的方法打開(kāi)一個(gè)文件: if (fp=fopen(“file1”,r)=NULL)printf(“cannot open this filen”); exit(0);終止正在執(zhí)行的程序終止正在執(zhí)行的程序39home back first prev next last 說(shuō)明:說(shuō)明:(6) C標(biāo)準(zhǔn)建議用表標(biāo)準(zhǔn)建議用表10.1列出的文件使用方式打開(kāi)列出的文件使用方式打開(kāi)文本文件或二進(jìn)制文件,但目前使用的有些文本文件或二進(jìn)制文件,但目前使用的有

26、些C編譯系統(tǒng)可能不完全提供所有這些功能編譯系統(tǒng)可能不完全提供所有這些功能40home back first prev next last 說(shuō)明:說(shuō)明:(7) 計(jì)算機(jī)輸從計(jì)算機(jī)輸從ASCII文件讀入字符時(shí),遇到回車文件讀入字符時(shí),遇到回車換行符,系統(tǒng)把它轉(zhuǎn)換為一個(gè)換行符,在輸換行符,系統(tǒng)把它轉(zhuǎn)換為一個(gè)換行符,在輸出時(shí)把換行符轉(zhuǎn)換成為回車和換行兩個(gè)字符。出時(shí)把換行符轉(zhuǎn)換成為回車和換行兩個(gè)字符。在用二進(jìn)制文件時(shí),不進(jìn)行這種轉(zhuǎn)換,在內(nèi)在用二進(jìn)制文件時(shí),不進(jìn)行這種轉(zhuǎn)換,在內(nèi)存中的數(shù)據(jù)形式與輸出到外部文件中的數(shù)據(jù)存中的數(shù)據(jù)形式與輸出到外部文件中的數(shù)據(jù)形式完全一致,一一對(duì)應(yīng)。形式完全一致,一一對(duì)應(yīng)。41ho

27、me back first prev next last 說(shuō)明:說(shuō)明:(8) 程序中可以使用程序中可以使用3個(gè)標(biāo)準(zhǔn)的流文件個(gè)標(biāo)準(zhǔn)的流文件:標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入流、標(biāo)準(zhǔn)輸出流、標(biāo)準(zhǔn)出錯(cuò)輸出流。流、標(biāo)準(zhǔn)輸出流、標(biāo)準(zhǔn)出錯(cuò)輸出流。 系統(tǒng)已對(duì)這系統(tǒng)已對(duì)這3個(gè)文件指定了與終端的對(duì)應(yīng)關(guān)系個(gè)文件指定了與終端的對(duì)應(yīng)關(guān)系 標(biāo)準(zhǔn)輸入流是從終端的輸入標(biāo)準(zhǔn)輸入流是從終端的輸入 標(biāo)準(zhǔn)輸出流是向終端的輸出標(biāo)準(zhǔn)輸出流是向終端的輸出 標(biāo)準(zhǔn)出錯(cuò)輸出流是當(dāng)程序出錯(cuò)時(shí)將出錯(cuò)信息發(fā)標(biāo)準(zhǔn)出錯(cuò)輸出流是當(dāng)程序出錯(cuò)時(shí)將出錯(cuò)信息發(fā)送到終端送到終端42home back first prev next last 程序開(kāi)始運(yùn)行時(shí)系統(tǒng)自動(dòng)打開(kāi)這程序開(kāi)始運(yùn)

28、行時(shí)系統(tǒng)自動(dòng)打開(kāi)這3個(gè)標(biāo)準(zhǔn)個(gè)標(biāo)準(zhǔn)流文件。因此,程序編寫(xiě)者不需要在程流文件。因此,程序編寫(xiě)者不需要在程序中用序中用fopen函數(shù)打開(kāi)它們。所以以前我函數(shù)打開(kāi)它們。所以以前我們用到的從終端輸入或輸出到終端都不們用到的從終端輸入或輸出到終端都不需要打開(kāi)終端文件。需要打開(kāi)終端文件。43home back first prev next last 關(guān)閉文件用關(guān)閉文件用fclose函數(shù)。函數(shù)。fclose函數(shù)調(diào)用的函數(shù)調(diào)用的一般形式為一般形式為fclose(文件指針文件指針); 例如:例如: fclose (fp); 如果不關(guān)閉文件將會(huì)如果不關(guān)閉文件將會(huì)丟失丟失數(shù)據(jù)。數(shù)據(jù)。44home back firs

29、t prev next last 在順序?qū)憰r(shí),先寫(xiě)入的數(shù)據(jù)存放在文件中在順序?qū)憰r(shí),先寫(xiě)入的數(shù)據(jù)存放在文件中前面,后寫(xiě)入的數(shù)據(jù)存放在文件中后面前面,后寫(xiě)入的數(shù)據(jù)存放在文件中后面 在順序讀時(shí),先讀文件中前面的數(shù)據(jù),后在順序讀時(shí),先讀文件中前面的數(shù)據(jù),后讀文件中后面的數(shù)據(jù)讀文件中后面的數(shù)據(jù) 對(duì)順序讀寫(xiě)來(lái)說(shuō),對(duì)文件讀寫(xiě)數(shù)據(jù)的順序?qū)樞蜃x寫(xiě)來(lái)說(shuō),對(duì)文件讀寫(xiě)數(shù)據(jù)的順序和數(shù)據(jù)在文件中的物理順序是一致的和數(shù)據(jù)在文件中的物理順序是一致的 順序讀寫(xiě)需要用庫(kù)函數(shù)實(shí)現(xiàn)順序讀寫(xiě)需要用庫(kù)函數(shù)實(shí)現(xiàn)45home back first prev next last10.3.1 怎樣向文件讀寫(xiě)字符怎樣向文件讀寫(xiě)字符10.3.2

30、怎樣向文件讀寫(xiě)一個(gè)字符串怎樣向文件讀寫(xiě)一個(gè)字符串10.3.3 用格式化的方式讀寫(xiě)文用格式化的方式讀寫(xiě)文件件10.3.4 用二進(jìn)制方式向文件讀寫(xiě)一組數(shù)據(jù)用二進(jìn)制方式向文件讀寫(xiě)一組數(shù)據(jù)46home back first prev next last函數(shù)名函數(shù)名調(diào)用形式調(diào)用形式功能功能返回值返回值fgetcfgetc(fp)從從fp指向的指向的文件讀入一文件讀入一個(gè)字符個(gè)字符讀成功,帶回所讀讀成功,帶回所讀的字符,失敗則返的字符,失敗則返回文件結(jié)束標(biāo)志回文件結(jié)束標(biāo)志(即即-1)fputcfputc(ch,fp)把字符把字符ch寫(xiě)寫(xiě)到文件指針到文件指針變量變量fp所指所指向的文件中向的文件中寫(xiě)成功,返

31、回值就寫(xiě)成功,返回值就是輸出的字符;輸是輸出的字符;輸出失敗,則返回出失敗,則返回(即(即-1) 讀寫(xiě)一個(gè)字符的函數(shù)讀寫(xiě)一個(gè)字符的函數(shù)47home back first prev next last 例例10.1 從鍵盤(pán)輸入一些字符,逐個(gè)把它們從鍵盤(pán)輸入一些字符,逐個(gè)把它們送到磁盤(pán)上去,直到用戶輸入一個(gè)送到磁盤(pán)上去,直到用戶輸入一個(gè)“”為止。為止。 解題思路:用解題思路:用fgetc函數(shù)從鍵盤(pán)逐個(gè)輸入字函數(shù)從鍵盤(pán)逐個(gè)輸入字符,然后用符,然后用fputc函數(shù)寫(xiě)到磁盤(pán)文件即可。函數(shù)寫(xiě)到磁盤(pán)文件即可。48home back first prev next last#include #include

32、int main() FILE *fp; char ch,filename10; printf(請(qǐng)輸入所用的文件名:請(qǐng)輸入所用的文件名:); scanf(%s,filename); if(fp=fopen(filename,“w”)=NULL) printf(無(wú)法打開(kāi)此文件無(wú)法打開(kāi)此文件n); exit(0); ch=getchar( );接收最后輸接收最后輸入的回車符入的回車符輸入輸入文件名文件名只寫(xiě)只寫(xiě)用用exit函數(shù)時(shí)加函數(shù)時(shí)加49home back first prev next last printf(“請(qǐng)輸入一個(gè)字符串請(qǐng)輸入一個(gè)字符串(以以#結(jié)束結(jié)束):); ch=getchar(

33、 ); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp); putchar(10); return 0;50home back first prev next last 例例10.2 將一個(gè)磁盤(pán)文件中的信息復(fù)制到另一將一個(gè)磁盤(pán)文件中的信息復(fù)制到另一個(gè)磁盤(pán)文件中。個(gè)磁盤(pán)文件中。 今要求將上例建立的今要求將上例建立的file1.dat文件中的內(nèi)容復(fù)制到另一個(gè)磁盤(pán)文文件中的內(nèi)容復(fù)制到另一個(gè)磁盤(pán)文件件file2.dat中。中。 解題思路:處理此問(wèn)題的算法是:從解題思路:處理此問(wèn)題的算法是:從file1.dat文件中逐個(gè)讀入

34、字符,然后逐個(gè)輸文件中逐個(gè)讀入字符,然后逐個(gè)輸出到出到file2.dat中。中。51home back first prev next last#include #include int main( ) FILE *in,*out; char ch,infile10,outfile10; printf(輸入讀入文件的名字輸入讀入文件的名字:); scanf(%s,infile); printf(輸入輸出文件的名字輸入輸出文件的名字:); scanf(“%s”,outfile); if(in=fopen(infile,“r”)=NULL) printf(無(wú)法打開(kāi)此文件無(wú)法打開(kāi)此文件n); exi

35、t(0); if(out=fopen(outfile,“w”)=NULL) printf(無(wú)法打開(kāi)此文件無(wú)法打開(kāi)此文件n); exit(0); 改為改為rb和和wb,則,則復(fù)復(fù)制一個(gè)二進(jìn)制文件制一個(gè)二進(jìn)制文件改為改為rb和和wb,則,則復(fù)復(fù)制一個(gè)二進(jìn)制文件制一個(gè)二進(jìn)制文件52home back first prev next last while(!feof(in) ch=fgetc(in); fputc(ch,out); putchar(ch); putchar(10); fclose(in); fclose(out); return 0;檢查當(dāng)前讀寫(xiě)位置檢查當(dāng)前讀寫(xiě)位置是否移到文件末尾是否

36、移到文件末尾53home back first prev next last 讀寫(xiě)一個(gè)字符串的函數(shù)讀寫(xiě)一個(gè)字符串的函數(shù)函數(shù)名函數(shù)名調(diào)用形式調(diào)用形式功能功能返回值返回值fgetsfgets(str,n,fp)從從fp指向的文件讀指向的文件讀入長(zhǎng)度為入長(zhǎng)度為(n-1)的字的字符串,存放到字符符串,存放到字符數(shù)組數(shù)組str中中讀成功,返讀成功,返回地址回地址str,失敗則返回失敗則返回NULL)fputsfputs(str,fp)str所指向的字符串所指向的字符串寫(xiě)到文件指針變量寫(xiě)到文件指針變量fp所指向的文件中所指向的文件中寫(xiě)成功,返寫(xiě)成功,返回回 0 ; 否 則; 否 則返回非返回非0值值54h

37、ome back first prev next last 說(shuō)明:說(shuō)明:fgets函數(shù)的函數(shù)原型為:函數(shù)的函數(shù)原型為: char *fgets (char *str,int n,FILE *fp); 其作用是從文件讀入一個(gè)字符串其作用是從文件讀入一個(gè)字符串 調(diào)用時(shí)可以寫(xiě)成:調(diào)用時(shí)可以寫(xiě)成: fgets(str,n,fp);55home back first prev next last 說(shuō)明:說(shuō)明: fgets(str,n,fp);中中n是要求得到的字符個(gè)數(shù),但實(shí)際是要求得到的字符個(gè)數(shù),但實(shí)際上只讀上只讀n-1個(gè)字符,然后在最后加一個(gè)個(gè)字符,然后在最后加一個(gè)0字符,字符,這樣得到的字符串共有這

38、樣得到的字符串共有n個(gè)字符,把它們放到字個(gè)字符,把它們放到字符數(shù)組符數(shù)組str中中 如果在讀完如果在讀完n-1個(gè)字符之前遇到換行符個(gè)字符之前遇到換行符“n”或文或文件結(jié)束符件結(jié)束符EOF,讀入即結(jié)束,但將所遇到的換行,讀入即結(jié)束,但將所遇到的換行符符“n”也作為一個(gè)字符讀入也作為一個(gè)字符讀入 執(zhí)行執(zhí)行fgets成功,返回成功,返回str數(shù)組首地址,如果一開(kāi)數(shù)組首地址,如果一開(kāi)始就遇到文件尾或讀數(shù)據(jù)錯(cuò),返回始就遇到文件尾或讀數(shù)據(jù)錯(cuò),返回NULL56home back first prev next last 說(shuō)明:說(shuō)明:fputs函數(shù)的函數(shù)原型為:函數(shù)的函數(shù)原型為: int fputs (cha

39、r *str, FILE *fp); str指向的字符串輸出到指向的字符串輸出到fp所指向的文件中所指向的文件中 調(diào)用時(shí)可以寫(xiě)成:調(diào)用時(shí)可以寫(xiě)成: fputs(China”,fp); fputs函數(shù)中第一個(gè)參數(shù)可以是字符串常量、字函數(shù)中第一個(gè)參數(shù)可以是字符串常量、字符數(shù)組名或字符型指針?lè)麛?shù)組名或字符型指針 字符串末尾的字符串末尾的0不輸出不輸出 輸出成功,函數(shù)值為;失敗,函數(shù)值為輸出成功,函數(shù)值為;失敗,函數(shù)值為EOF57home back first prev next last 例例10.3 從鍵盤(pán)讀入若干個(gè)字符串,對(duì)它們按從鍵盤(pán)讀入若干個(gè)字符串,對(duì)它們按字母大小的順序排序,然后把排好序的

40、字符字母大小的順序排序,然后把排好序的字符串送到磁盤(pán)文件中保存。串送到磁盤(pán)文件中保存。 解題思路:為解決問(wèn)題,可分為三個(gè)步驟:解題思路:為解決問(wèn)題,可分為三個(gè)步驟: 從鍵盤(pán)讀入從鍵盤(pán)讀入n個(gè)字符串,存放在一個(gè)二維字符數(shù)個(gè)字符串,存放在一個(gè)二維字符數(shù)組中,每一個(gè)一維數(shù)組存放一個(gè)字符串;組中,每一個(gè)一維數(shù)組存放一個(gè)字符串; 對(duì)字符數(shù)組中的對(duì)字符數(shù)組中的n個(gè)字符串按字個(gè)字符串按字母母順序排序,排順序排序,排好序的字符串仍存放在字符數(shù)組中;好序的字符串仍存放在字符數(shù)組中; 將字符數(shù)組中的字符串順序輸出。將字符數(shù)組中的字符串順序輸出。58home back first prev next last#in

41、clude #include #include int main() FILE *fp; char str310,temp10; int i,j,k,n=3; printf(“Enter strings:n”); for(i=0;in;i+) gets(stri);59home back first prev next last for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) strcpy(temp,stri); strcpy(stri,strk); strcpy(strk,temp); 60home back first prev next

42、 last if(fp=fopen(“D:CCstring.dat”, “w”)=NULL) printf(cant open file!n); exit(0); printf(nThe new sequence:n); for(i=0;in;i+) fputs(stri,fp); fputs(“n”,fp); printf(“%sn”,stri); return 0;人為地輸出一個(gè)人為地輸出一個(gè)n61home back first prev next last 思考:思考: 從文件從文件string.dat中讀回字符串,并在屏幕中讀回字符串,并在屏幕上顯示上顯示,應(yīng)如何編寫(xiě)程序?,應(yīng)如何編寫(xiě)

43、程序?62home back first prev next last#include #include int main() FILE *fp; char str310; int i=0; if(fp=fopen(“D:CCstring.dat”, “r”)=NULL) printf(cant open file!n);exit(0); while(fgets(stri,10,fp)!=NULL) printf(%s,stri); i+; fclose (fp); return 0;不用不用人為地輸出人為地輸出n63home back first prev next last 一般調(diào)用方式為

44、:一般調(diào)用方式為:fprintf(文件指針文件指針,格式字符串格式字符串,輸出表列輸出表列);fscanf (文件指針文件指針,格式字符串格式字符串,輸入表列輸入表列);如:如:fprintf (fp,”%d,%6.2f”,i,f);fscanf (fp,”%d,%f”,&i,&f);64home back first prev next last 一般調(diào)用形式為一般調(diào)用形式為:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); 65home back first prev next last buffer:是一個(gè)

45、地址:是一個(gè)地址 對(duì)對(duì)fread來(lái)說(shuō),它是用來(lái)存放從文件讀入的數(shù)來(lái)說(shuō),它是用來(lái)存放從文件讀入的數(shù)據(jù)的存儲(chǔ)區(qū)的地址據(jù)的存儲(chǔ)區(qū)的地址 對(duì)對(duì)fwrite來(lái)說(shuō),是要把此地址開(kāi)始的存儲(chǔ)區(qū)中來(lái)說(shuō),是要把此地址開(kāi)始的存儲(chǔ)區(qū)中的數(shù)據(jù)向文件輸出的數(shù)據(jù)向文件輸出 size:要讀寫(xiě)的字節(jié)數(shù):要讀寫(xiě)的字節(jié)數(shù) count:要讀寫(xiě)多少個(gè)數(shù)據(jù)項(xiàng):要讀寫(xiě)多少個(gè)數(shù)據(jù)項(xiàng) fp:FILE類型指針類型指針66home back first prev next last 例例10.4 從鍵盤(pán)輸入從鍵盤(pán)輸入10個(gè)學(xué)生的有關(guān)數(shù)據(jù),然個(gè)學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤(pán)文件上去。后把它們轉(zhuǎn)存到磁盤(pán)文件上去。 解題思路:解題思路: 定義有定

46、義有10個(gè)元素的結(jié)構(gòu)體數(shù)組,用來(lái)存放個(gè)元素的結(jié)構(gòu)體數(shù)組,用來(lái)存放10個(gè)個(gè)學(xué)生的數(shù)據(jù)學(xué)生的數(shù)據(jù) 從從main函數(shù)輸入函數(shù)輸入10個(gè)學(xué)生的數(shù)據(jù)個(gè)學(xué)生的數(shù)據(jù) 用用save函數(shù)實(shí)現(xiàn)向磁盤(pán)輸出學(xué)生數(shù)據(jù)函數(shù)實(shí)現(xiàn)向磁盤(pán)輸出學(xué)生數(shù)據(jù) 用用fwrite函數(shù)一次輸出一個(gè)學(xué)生的數(shù)據(jù)函數(shù)一次輸出一個(gè)學(xué)生的數(shù)據(jù)67home back first prev next last#include #define SIZE 10struct Student_type char name10; int num; int age; char addr15; studSIZE; 68home back first prev next

47、 lastvoid save( ) FILE *fp; int i; if(fp=fopen(stu.dat,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) if(fwrite(&studi, sizeof(struct Student_type), 1,fp)!=1) printf(file write errorn); fclose(fp);10+4+4+15=33,實(shí)際上,實(shí)際上開(kāi)辟開(kāi)辟36字節(jié),是字節(jié),是4的倍數(shù)的倍數(shù)當(dāng)前路徑下的文件當(dāng)前路徑下的文件69home back first prev nex

48、t lastint main() int i; printf(“enter data of students:n); for(i=0;iSIZE;i+) scanf(%s%d%d%s, ,&studi.num, &studi.age,studi.addr); save( ); return 0;70home back first prev next last 為了驗(yàn)證在磁盤(pán)文件為了驗(yàn)證在磁盤(pán)文件“stu.dat”中是否中是否已存在此數(shù)據(jù),可以用以下程序從已存在此數(shù)據(jù),可以用以下程序從“stu.dat”文件中讀入數(shù)據(jù),然后在屏文件中讀入數(shù)據(jù),然后在屏幕上輸出。

49、幕上輸出。71home back first prev next last#include #include #define SIZE 10struct Student_type char name10; int num; int age; char addr15;studSIZE; 72home back first prev next lastint main( )int i; FILE *fp; if(fp=fopen(stu.dat,rb)=NULL) printf(cannot open filen); exit(0); for(i=0;iSIZE;i+) fread (&s

50、tudi,sizeof(struct Student_type),1,fp); printf (“%-10s %4d %4d %-15sn”, ,studi.num, studi. age,studi.addr); fclose (fp); return 0;73home back first prev next last 如果修改如果修改例例10.4:從:從已有的二進(jìn)制已有的二進(jìn)制文件文件“stu.list”中,讀入數(shù)據(jù)并輸出到中,讀入數(shù)據(jù)并輸出到“stu.dat”文件中文件中,應(yīng)如何修改程序?,應(yīng)如何修改程序? 解題思路:解題思路: 編寫(xiě)編寫(xiě)load函數(shù)函數(shù) main函

51、數(shù)中再調(diào)用函數(shù)中再調(diào)用load函數(shù)函數(shù)74home back first prev next lastvoid load( ) FILE *fp; int i; if(fp=fopen(stu_list,rb)=NULL) printf(cannot open infilen); return; for(i=0;iSIZE;i+) if(fread(&studi,sizeof(struct student_type),1,fp)!=1) if(feof(fp) fclose(fp); return; printf(file read errorn); fclose (fp);75hom

52、e back first prev next lastint main() load(); save(); return 0;76home back first prev next last 對(duì)文件進(jìn)行順序讀寫(xiě)比較容易理解,也容對(duì)文件進(jìn)行順序讀寫(xiě)比較容易理解,也容易操作,但有時(shí)效率不高易操作,但有時(shí)效率不高 隨機(jī)訪問(wèn)不是按數(shù)據(jù)在文件中的物理位置隨機(jī)訪問(wèn)不是按數(shù)據(jù)在文件中的物理位置次序進(jìn)行讀寫(xiě),而是可以對(duì)任何位置上的次序進(jìn)行讀寫(xiě),而是可以對(duì)任何位置上的數(shù)據(jù)進(jìn)行訪問(wèn),顯然這種方法比順序訪問(wèn)數(shù)據(jù)進(jìn)行訪問(wèn),顯然這種方法比順序訪問(wèn)效率高得多效率高得多77home back first prev next

53、 last10.4.1 文件位置標(biāo)記及其定位文件位置標(biāo)記及其定位10.4.2 隨機(jī)讀寫(xiě)隨機(jī)讀寫(xiě)78home back first prev next last1.文件位置標(biāo)記文件位置標(biāo)記 為了對(duì)讀寫(xiě)進(jìn)行控制,系統(tǒng)為每個(gè)文為了對(duì)讀寫(xiě)進(jìn)行控制,系統(tǒng)為每個(gè)文件設(shè)置了一個(gè)文件讀寫(xiě)位置標(biāo)記件設(shè)置了一個(gè)文件讀寫(xiě)位置標(biāo)記(簡(jiǎn)稱簡(jiǎn)稱文件標(biāo)記文件標(biāo)記),用來(lái)指示,用來(lái)指示“接下來(lái)要讀寫(xiě)接下來(lái)要讀寫(xiě)的下一個(gè)字符的位置的下一個(gè)字符的位置”79home back first prev next last文件指針文件指針讀寫(xiě)當(dāng)前位置讀寫(xiě)當(dāng)前位置文件尾文件尾1.文件位置標(biāo)記文件位置標(biāo)記文件頭文件頭80home back

54、first prev next last1.文件位置標(biāo)記文件位置標(biāo)記 一般情況下,在對(duì)字符文件進(jìn)行順序讀一般情況下,在對(duì)字符文件進(jìn)行順序讀寫(xiě)時(shí),文件標(biāo)記指向文件開(kāi)頭,進(jìn)行讀寫(xiě)時(shí),文件標(biāo)記指向文件開(kāi)頭,進(jìn)行讀的操作的操作時(shí)時(shí),就讀第一個(gè)字符,然后文件,就讀第一個(gè)字符,然后文件標(biāo)記向后移一個(gè)位置,在下一次讀操作標(biāo)記向后移一個(gè)位置,在下一次讀操作時(shí),就將位置標(biāo)記指向的第二個(gè)字符讀時(shí),就將位置標(biāo)記指向的第二個(gè)字符讀入。依此類推,直到遇文件尾,結(jié)束入。依此類推,直到遇文件尾,結(jié)束81home back first prev next last1.文件位置標(biāo)記文件位置標(biāo)記 如果是順序?qū)懳募?,則每寫(xiě)完一個(gè)數(shù)

55、據(jù)如果是順序?qū)懳募?,則每寫(xiě)完一個(gè)數(shù)據(jù)后,文件標(biāo)記順序向后移一個(gè)位置,然后,文件標(biāo)記順序向后移一個(gè)位置,然后在下一次執(zhí)行寫(xiě)操作時(shí)把數(shù)據(jù)寫(xiě)入指后在下一次執(zhí)行寫(xiě)操作時(shí)把數(shù)據(jù)寫(xiě)入指針?biāo)傅奈恢?。直到把全部?shù)據(jù)寫(xiě)完,針?biāo)傅奈恢?。直到把全部?shù)據(jù)寫(xiě)完,此時(shí)文件位置標(biāo)記在最后一個(gè)數(shù)據(jù)之后此時(shí)文件位置標(biāo)記在最后一個(gè)數(shù)據(jù)之后82home back first prev next last1.文件位置標(biāo)記文件位置標(biāo)記 可以根據(jù)讀寫(xiě)的需要,人為地移動(dòng)了文可以根據(jù)讀寫(xiě)的需要,人為地移動(dòng)了文件標(biāo)記的位置。文件標(biāo)記可以向前移、件標(biāo)記的位置。文件標(biāo)記可以向前移、向后移,移到文件頭或文件尾,然后對(duì)向后移,移到文件頭或文件尾,

56、然后對(duì)該位置進(jìn)行讀寫(xiě)該位置進(jìn)行讀寫(xiě)隨機(jī)讀寫(xiě)隨機(jī)讀寫(xiě) 隨機(jī)讀寫(xiě)隨機(jī)讀寫(xiě)可以在任何位置寫(xiě)入數(shù)據(jù),在可以在任何位置寫(xiě)入數(shù)據(jù),在任何位置讀取數(shù)據(jù)任何位置讀取數(shù)據(jù)83home back first prev next last2. 文件位置標(biāo)記的定位文件位置標(biāo)記的定位 可以強(qiáng)制使文件位置標(biāo)記指向指定的位置可以強(qiáng)制使文件位置標(biāo)記指向指定的位置 可以用以下函數(shù)實(shí)現(xiàn)可以用以下函數(shù)實(shí)現(xiàn):(1)用用rewind函數(shù)使文件標(biāo)記指向文件開(kāi)頭函數(shù)使文件標(biāo)記指向文件開(kāi)頭 rewind函數(shù)的作用是使文件標(biāo)記重新返回文件函數(shù)的作用是使文件標(biāo)記重新返回文件的開(kāi)頭,此函數(shù)沒(méi)有返回值。的開(kāi)頭,此函數(shù)沒(méi)有返回值。84home bac

57、k first prev next last 例例10.5 有一個(gè)磁盤(pán)文件,內(nèi)有一些信息。要有一個(gè)磁盤(pán)文件,內(nèi)有一些信息。要求第一次將它的內(nèi)容顯示在屏幕上,第二求第一次將它的內(nèi)容顯示在屏幕上,第二次把它復(fù)制到另一文件上次把它復(fù)制到另一文件上。85home back first prev next last 解題思路:解題思路: 因?yàn)樵诘谝淮巫x入完文件內(nèi)容后,文件標(biāo)因?yàn)樵诘谝淮巫x入完文件內(nèi)容后,文件標(biāo)記已指到文件的末尾,如果再接著讀數(shù)據(jù),記已指到文件的末尾,如果再接著讀數(shù)據(jù),就遇到文件結(jié)束標(biāo)志,就遇到文件結(jié)束標(biāo)志,feof函數(shù)的值等于函數(shù)的值等于1(真真),無(wú)法再讀數(shù)據(jù),無(wú)法再讀數(shù)據(jù) 必須在程序

58、中用必須在程序中用rewind函數(shù)使位置指針?lè)祷睾瘮?shù)使位置指針?lè)祷匚募拈_(kāi)頭文件的開(kāi)頭86home back first prev next last#includeint main() FILE *fp1,*fp2; fp1=fopen(“file1.dat”,“r”); fp2=fopen(“file2.dat”,“w”); while(!feof(fp1) putchar(getc(fp1); putchar(10); rewind(fp1); while(!feof(fp1) putc(getc(fp1),fp2); fclose(fp1); fclose(fp2); return 0

59、;87home back first prev next last2. 文件位置標(biāo)記的定位文件位置標(biāo)記的定位 可以強(qiáng)制使文件標(biāo)記指向指定的位置可以強(qiáng)制使文件標(biāo)記指向指定的位置 可以用以下函數(shù)實(shí)現(xiàn)可以用以下函數(shù)實(shí)現(xiàn):(2) 用用fseek函數(shù)改變文件標(biāo)記函數(shù)改變文件標(biāo)記fseek函數(shù)的調(diào)用形式為函數(shù)的調(diào)用形式為:fseek(文件類型指針文件類型指針,位移量位移量,起始點(diǎn)起始點(diǎn)) 起始點(diǎn)起始點(diǎn)0代表代表“文件開(kāi)始位置文件開(kāi)始位置”,1為為“當(dāng)前位當(dāng)前位置置”,2為為“文件末尾位置文件末尾位置”88home back first prev next last 標(biāo)準(zhǔn)指定的名字標(biāo)準(zhǔn)指定的名字起始點(diǎn)起始點(diǎn)名名 字字用數(shù)字代表用數(shù)字代表文件開(kāi)始位置文件開(kāi)始位置SEEK_SET0文件當(dāng)前位置文件當(dāng)前位置SEEK_CUR1文件末尾位置文件末尾位置SEEK_END289home back first prev next last 位移量指以起始點(diǎn)為基點(diǎn),向前移動(dòng)的字位移量指以起始點(diǎn)為基點(diǎn),向前移動(dòng)的字節(jié)數(shù)。位移量應(yīng)是節(jié)數(shù)。位移量應(yīng)是long型數(shù)據(jù)型數(shù)據(jù)(在數(shù)字的末在數(shù)字的末尾加一個(gè)字母尾加一個(gè)字母L)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論