幾個(gè)基本概念_第1頁(yè)
幾個(gè)基本概念_第2頁(yè)
幾個(gè)基本概念_第3頁(yè)
幾個(gè)基本概念_第4頁(yè)
幾個(gè)基本概念_第5頁(yè)
已閱讀5頁(yè),還剩38頁(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、1第第13章章文件文件21 幾個(gè)基本概念2 文件類(lèi)型指針3 文件的打開(kāi)與關(guān)閉4 文件的讀寫(xiě)5 文件的定位6 總結(jié)文件文件3幾個(gè)基本概念4 文件的基本概念文件的基本概念u文件(文件(file):存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)的集合。:存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)的集合。u操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的。在程序運(yùn)行時(shí),操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的。在程序運(yùn)行時(shí),常常需要將一些數(shù)據(jù)輸出到磁盤(pán)上存放起來(lái),以后需要時(shí)再?gòu)某3P枰獙⒁恍?shù)據(jù)輸出到磁盤(pán)上存放起來(lái),以后需要時(shí)再?gòu)拇疟P(pán)中輸入到計(jì)算機(jī)內(nèi)存。這就要用到磁盤(pán)中輸入到計(jì)算機(jī)內(nèi)存。這就要用到磁盤(pán)文件磁盤(pán)文件。uwindows下每個(gè)文件對(duì)應(yīng)的四項(xiàng)參數(shù):

2、文件名、大小、類(lèi)型、下每個(gè)文件對(duì)應(yīng)的四項(xiàng)參數(shù):文件名、大小、類(lèi)型、修改時(shí)間修改時(shí)間uC語(yǔ)言把文件看作是一個(gè)字符(字節(jié))的序列,即由一個(gè)一個(gè)語(yǔ)言把文件看作是一個(gè)字符(字節(jié))的序列,即由一個(gè)一個(gè)字符(字節(jié))的數(shù)據(jù)順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為字符(字節(jié))的數(shù)據(jù)順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為ASCII文件(文本文件)文件(文本文件)和和二進(jìn)制文件二進(jìn)制文件。5文本文件文本文件l文本文件的每一個(gè)字節(jié)放一個(gè)文本文件的每一個(gè)字節(jié)放一個(gè)ASCIIASCII碼,代表一個(gè)字符。文本文件的碼,代表一個(gè)字符。文本文件的輸出與字字符對(duì)應(yīng),一個(gè)字節(jié)代表一個(gè)字符,例如一個(gè)整數(shù)輸出與字字符對(duì)應(yīng),一個(gè)字節(jié)代表一個(gè)

3、字符,例如一個(gè)整數(shù)1000010000占占用用5 5個(gè)字節(jié)個(gè)字節(jié)l因此便于對(duì)字符逐個(gè)處理,也便于輸出字符。因此便于對(duì)字符逐個(gè)處理,也便于輸出字符。l文本文件由文本行組成,每一行中可以有文本文件由文本行組成,每一行中可以有0 0個(gè)或者多個(gè)字符,并以換個(gè)或者多個(gè)字符,并以換行符行符nn結(jié)尾,文本結(jié)束標(biāo)記是結(jié)尾,文本結(jié)束標(biāo)記是0X1A0X1A。在文本文件向計(jì)算機(jī)輸入的時(shí)。在文本文件向計(jì)算機(jī)輸入的時(shí)候,將回車(chē)換行符候,將回車(chē)換行符(r,n(r,n)轉(zhuǎn)換為換行符,在輸出的時(shí)候把換行轉(zhuǎn)換為換行符,在輸出的時(shí)候把換行符符(n)(n)轉(zhuǎn)換為回車(chē)和換行兩個(gè)字符。轉(zhuǎn)換為回車(chē)和換行兩個(gè)字符。l例如輸入例如輸入abc

4、dabcdefghefgh則存儲(chǔ)為文本文件以后,第則存儲(chǔ)為文本文件以后,第7 7個(gè)字符是個(gè)字符是f f而不是而不是e el例如:例如:1000010000是整型數(shù)據(jù),用二進(jìn)制表示占兩個(gè)字節(jié),如用是整型數(shù)據(jù),用二進(jìn)制表示占兩個(gè)字節(jié),如用ASCIIASCII碼輸出,則占五個(gè)字節(jié)。碼輸出,則占五個(gè)字節(jié)。 l 二進(jìn)制形式二進(jìn)制形式:00100111 0001000000100111 00010000l ASCIIASCII形式形式:00110001 00110000 00110000 00110000 0011000000110001 00110000 00110000 00110000 001100

5、006二進(jìn)制文件二進(jìn)制文件l二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤(pán)上存放。存中的存儲(chǔ)形式原樣輸出到磁盤(pán)上存放。l其優(yōu)點(diǎn)是節(jié)省空間其優(yōu)點(diǎn)是節(jié)省空間 , , 輸入輸出速度快輸入輸出速度快; ; l缺點(diǎn)是一個(gè)字節(jié)并不對(duì)應(yīng)一個(gè)字符(如缺點(diǎn)是一個(gè)字節(jié)并不對(duì)應(yīng)一個(gè)字符(如一個(gè)整數(shù)一個(gè)整數(shù)1000010000占用占用2 2個(gè)字節(jié)),不能直個(gè)字節(jié)),不能直接輸出字符的形式。接輸出字符的形式。l二進(jìn)制文件不能象文本文件那樣從回車(chē)二進(jìn)制文件不能象文本文件那樣從回車(chē)換行符到換行符之間的轉(zhuǎn)換。換行符到換行符之間的轉(zhuǎn)換。7設(shè)備文件設(shè)備文件l在在C C中把所有外部

6、設(shè)備作為文件對(duì)待,這樣的文中把所有外部設(shè)備作為文件對(duì)待,這樣的文件稱為設(shè)備文件。例如把打印機(jī)設(shè)為設(shè)備文件件稱為設(shè)備文件。例如把打印機(jī)設(shè)為設(shè)備文件的時(shí)候,由系統(tǒng)命名為的時(shí)候,由系統(tǒng)命名為PRNPRN文件。向文件。向PRNPRN文件文文件文件輸出數(shù)據(jù),就是向打印機(jī)輸出數(shù)據(jù)。件輸出數(shù)據(jù),就是向打印機(jī)輸出數(shù)據(jù)。C C語(yǔ)言中語(yǔ)言中常用的標(biāo)準(zhǔn)設(shè)備的文件名如下:常用的標(biāo)準(zhǔn)設(shè)備的文件名如下:lCONCON或或KYBD KYBD 鍵盤(pán)鍵盤(pán)lCON CON 或或 SCRN SCRN 顯示器顯示器lPRNPRN或或LPT1LPT1打印機(jī)打印機(jī)lAUXAUX或或COM1COM1異步通信口異步通信口l另外還有另外還有3

7、 3個(gè)標(biāo)準(zhǔn)設(shè)備文件的文件結(jié)構(gòu)體指針也個(gè)標(biāo)準(zhǔn)設(shè)備文件的文件結(jié)構(gòu)體指針也是由系統(tǒng)命名而成的是由系統(tǒng)命名而成的lstdinstdinlstdoutstdoutlstderrstderr8流流l流是程序輸入或者輸一個(gè)出的一個(gè)連流是程序輸入或者輸一個(gè)出的一個(gè)連續(xù)序列,設(shè)備(鍵盤(pán),磁盤(pán),顯示器續(xù)序列,設(shè)備(鍵盤(pán),磁盤(pán),顯示器和打印機(jī)等)輸入輸出都是用流來(lái)處和打印機(jī)等)輸入輸出都是用流來(lái)處理的。在理的。在C C語(yǔ)言中,所有的流均以文件語(yǔ)言中,所有的流均以文件的形式出現(xiàn),包括設(shè)備文件。流實(shí)際的形式出現(xiàn),包括設(shè)備文件。流實(shí)際上是文件輸入輸出的一種動(dòng)態(tài)的形式。上是文件輸入輸出的一種動(dòng)態(tài)的形式。一個(gè)一個(gè)C C文件即

8、是字節(jié)流或二進(jìn)制流。文件即是字節(jié)流或二進(jìn)制流。9文件類(lèi)型指針10u從磁盤(pán)文件輸入數(shù)據(jù)時(shí)從磁盤(pán)文件輸入數(shù)據(jù)時(shí)(即讀文件即讀文件), 先將數(shù)據(jù)送到先將數(shù)據(jù)送到輸入緩沖區(qū)輸入緩沖區(qū), 再?gòu)木彌_區(qū)將數(shù)據(jù)傳送給程序數(shù)據(jù)區(qū)再?gòu)木彌_區(qū)將數(shù)據(jù)傳送給程序數(shù)據(jù)區(qū)(即傳給程序中的變量即傳給程序中的變量) ; 向磁盤(pán)文件輸出數(shù)據(jù)時(shí)向磁盤(pán)文件輸出數(shù)據(jù)時(shí)(即寫(xiě)文件即寫(xiě)文件), 先將程序中變量的值送到先將程序中變量的值送到輸出緩沖區(qū)輸出緩沖區(qū), 等緩沖區(qū)裝滿后再將數(shù)據(jù)一起傳送給磁盤(pán)文件等緩沖區(qū)裝滿后再將數(shù)據(jù)一起傳送給磁盤(pán)文件. 使用緩沖區(qū)的目的是為了減少對(duì)磁盤(pán)的實(shí)際讀寫(xiě)次數(shù)。使用緩沖區(qū)的目的是為了減少對(duì)磁盤(pán)的實(shí)際讀寫(xiě)次數(shù)。

9、u2. 磁盤(pán)文件系統(tǒng)的分類(lèi)磁盤(pán)文件系統(tǒng)的分類(lèi)u(1) 緩沖文件系統(tǒng)緩沖文件系統(tǒng): 系統(tǒng)自動(dòng)的在內(nèi)存區(qū)為每一個(gè)正在使用系統(tǒng)自動(dòng)的在內(nèi)存區(qū)為每一個(gè)正在使用的文件開(kāi)辟一個(gè)緩沖區(qū)的文件開(kāi)辟一個(gè)緩沖區(qū). 緩沖區(qū)的大小由具體的緩沖區(qū)的大小由具體的C版本確定版本確定, 一般為一般為512字節(jié)字節(jié).u(2) 非緩沖文件系統(tǒng)非緩沖文件系統(tǒng): 系統(tǒng)不是自動(dòng)開(kāi)辟確定大小的緩沖區(qū)系統(tǒng)不是自動(dòng)開(kāi)辟確定大小的緩沖區(qū),由程序?yàn)槊總€(gè)文件設(shè)定緩沖區(qū)及其大小由程序?yàn)槊總€(gè)文件設(shè)定緩沖區(qū)及其大小(即緩沖區(qū)由用戶根即緩沖區(qū)由用戶根據(jù)需要自己進(jìn)行設(shè)置據(jù)需要自己進(jìn)行設(shè)置) .uANSI C標(biāo)準(zhǔn)采用標(biāo)準(zhǔn)采用緩沖文件系統(tǒng)緩沖文件系統(tǒng)處理文本文

10、件和二進(jìn)制文件。處理文本文件和二進(jìn)制文件。u在在C語(yǔ)言中,對(duì)文件的讀寫(xiě)都是用庫(kù)函數(shù)來(lái)實(shí)現(xiàn)的。語(yǔ)言中,對(duì)文件的讀寫(xiě)都是用庫(kù)函數(shù)來(lái)實(shí)現(xiàn)的。磁盤(pán)文件系統(tǒng)磁盤(pán)文件系統(tǒng)11u緩沖文件系統(tǒng)中,每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟一個(gè)區(qū),用來(lái)緩沖文件系統(tǒng)中,每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟一個(gè)區(qū),用來(lái)存放文件的有關(guān)信息(如文件的名字、文件狀態(tài)及文件當(dāng)前位置等存放文件的有關(guān)信息(如文件的名字、文件狀態(tài)及文件當(dāng)前位置等)。)。u要使用一個(gè)文件需要有一定的信息要使用一個(gè)文件需要有一定的信息 , 如文件如文件當(dāng)前的讀寫(xiě)位置當(dāng)前的讀寫(xiě)位置, 與文件與文件對(duì)應(yīng)的內(nèi)存緩沖區(qū)地址對(duì)應(yīng)的內(nèi)存緩沖區(qū)地址, 文件的操作方式等文件的操作方

11、式等.這些信息都存放在這些信息都存放在文件文件信息區(qū)信息區(qū)中中 , 文件信息區(qū)文件信息區(qū)是一個(gè)結(jié)構(gòu)體變量是一個(gè)結(jié)構(gòu)體變量 , 其結(jié)構(gòu)體類(lèi)型由系統(tǒng)其結(jié)構(gòu)體類(lèi)型由系統(tǒng)定義定義, 類(lèi)型名為類(lèi)型名為 FILE 。Turbo C在在stdio.h文件中即有文件中即有FILE類(lèi)型聲類(lèi)型聲明。明。u可以定義文件型指針變量??梢远x文件型指針變量。如:如:FILE *fp; fp是一個(gè)指向是一個(gè)指向FILE類(lèi)型結(jié)構(gòu)體的指針變量。通過(guò)文件指針變量能類(lèi)型結(jié)構(gòu)體的指針變量。通過(guò)文件指針變量能夠找到與它相關(guān)的文件,以實(shí)現(xiàn)對(duì)文件的訪問(wèn)。夠找到與它相關(guān)的文件,以實(shí)現(xiàn)對(duì)文件的訪問(wèn)。注意注意: 1. 只有通過(guò)文件指針變量才能

12、調(diào)用相應(yīng)的文件只有通過(guò)文件指針變量才能調(diào)用相應(yīng)的文件 2. 有有n個(gè)文件就要定義個(gè)文件就要定義n個(gè)文件指針變量個(gè)文件指針變量, 分別對(duì)應(yīng)各個(gè)文件分別對(duì)應(yīng)各個(gè)文件 3. FILE必須大寫(xiě)必須大寫(xiě)磁盤(pán)文件系統(tǒng)磁盤(pán)文件系統(tǒng)12文件的打開(kāi)與關(guān)閉13打開(kāi)文件打開(kāi)文件u對(duì)文件讀寫(xiě)之前應(yīng)該對(duì)文件讀寫(xiě)之前應(yīng)該打開(kāi)打開(kāi)該文件,在使用結(jié)束之后應(yīng)該文件,在使用結(jié)束之后應(yīng)關(guān)閉關(guān)閉該文件。該文件。uANSI C規(guī)定了標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù),用規(guī)定了標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù),用 fopen()函數(shù)來(lái)實(shí)函數(shù)來(lái)實(shí)現(xiàn)打開(kāi)文件。調(diào)用方式為:現(xiàn)打開(kāi)文件。調(diào)用方式為:FILE *fp;fp=fopen(文件名,使用文件方式)(文件名,使用文件

13、方式);例如:例如: fp=fopen(a1, r);u在打開(kāi)一個(gè)文件時(shí),通知給編譯系統(tǒng)以下在打開(kāi)一個(gè)文件時(shí),通知給編譯系統(tǒng)以下3個(gè)信息:個(gè)信息:需要打開(kāi)的文件名,也就是準(zhǔn)備訪問(wèn)的文件的名字。需要打開(kāi)的文件名,也就是準(zhǔn)備訪問(wèn)的文件的名字。使用文件的方式(使用文件的方式(讀讀還是還是寫(xiě)寫(xiě)等)。等)。讓哪一個(gè)指針變量指向被打開(kāi)的文件。讓哪一個(gè)指針變量指向被打開(kāi)的文件。14打開(kāi)文件打開(kāi)文件mode含含 義義當(dāng)文件不存在當(dāng)文件不存在當(dāng)指定文件存在當(dāng)指定文件存在r讀取(文本文件)讀?。ㄎ谋疚募┱4蜷_(kāi)正常打開(kāi)正常打開(kāi)正常打開(kāi)w寫(xiě)入(文本文件)寫(xiě)入(文本文件)建立新文件建立新文件文件原有內(nèi)容丟失文件原有

14、內(nèi)容丟失a追加(文本文件)追加(文本文件)建立新文件建立新文件在文件末尾添加在文件末尾添加rb讀?。ǘM(jìn)制文件)讀?。ǘM(jìn)制文件)出錯(cuò)出錯(cuò)正常打開(kāi)正常打開(kāi)wb寫(xiě)入(二進(jìn)制文件)寫(xiě)入(二進(jìn)制文件)建立新文件建立新文件文件原有內(nèi)容丟失文件原有內(nèi)容丟失ab追加(二進(jìn)制文件)追加(二進(jìn)制文件)建立新文件建立新文件在文件末尾添加在文件末尾添加r+讀取讀取/ /寫(xiě)入(文本文件)寫(xiě)入(文本文件)出錯(cuò)出錯(cuò)正常打開(kāi)正常打開(kāi)w+寫(xiě)入寫(xiě)入/ /讀?。ㄎ谋疚募┳x?。ㄎ谋疚募┙⑿挛募⑿挛募募袃?nèi)容丟失文件原有內(nèi)容丟失a+讀取讀取/ /追加(文本文件)追加(文本文件)建立新文件建立新文件在文件末尾添加在文件

15、末尾添加rb+讀取讀取/ /寫(xiě)入(二進(jìn)制文件)寫(xiě)入(二進(jìn)制文件)出錯(cuò)出錯(cuò)正常打開(kāi)正常打開(kāi)wb+寫(xiě)入寫(xiě)入/ /讀?。ǘM(jìn)制文件)讀?。ǘM(jìn)制文件)建立新文件建立新文件文件原有內(nèi)容丟失文件原有內(nèi)容丟失ab+讀取讀取/ /追加(二進(jìn)制文件)追加(二進(jìn)制文件)建立新文件建立新文件在文件末尾添加在文件末尾添加15打開(kāi)文件打開(kāi)文件l如果不能實(shí)現(xiàn)如果不能實(shí)現(xiàn) 打開(kāi)打開(kāi) 的任務(wù),的任務(wù),fopenfopen函數(shù)函數(shù)將會(huì)帶回一個(gè)出錯(cuò)信息。此將會(huì)帶回一個(gè)出錯(cuò)信息。此時(shí)時(shí)fopenfopen函數(shù)將帶回一個(gè)空指針值函數(shù)將帶回一個(gè)空指針值NULLNULL。出錯(cuò)的原因可能是:。出錯(cuò)的原因可能是:l用用rr方式打開(kāi)一個(gè)并不

16、存在的文件方式打開(kāi)一個(gè)并不存在的文件; ;l磁盤(pán)出故障磁盤(pán)出故障; ;l磁盤(pán)已滿無(wú)法建立新文件等。磁盤(pán)已滿無(wú)法建立新文件等。#include stdlib.h#include stdio.hmain() FILE *fp; if (fp=fopen(“c:/abc.txt”,“r+”)!=NULL) /如果換成fopen(“PRN”,”w”); 表示什么? printf(open file success); else printf(open file failed); exit(0); 說(shuō)明說(shuō)明: exit : exit 函數(shù)的作用是關(guān)閉所有文件函數(shù)的作用是關(guān)閉所有文件, , 結(jié)束程序結(jié)束程

17、序, , 并返回并返回 操作系統(tǒng)操作系統(tǒng), , 也可寫(xiě)成也可寫(xiě)成 exit ( ) ; exit ( ) ; 注意注意: : 使用使用exitexit函數(shù)要包含頭文件函數(shù)要包含頭文件 stdlib.h 16系統(tǒng)標(biāo)準(zhǔn)文件系統(tǒng)標(biāo)準(zhǔn)文件u說(shuō)明:說(shuō)明:在程序開(kāi)始運(yùn)行時(shí),系統(tǒng)自動(dòng)打開(kāi)在程序開(kāi)始運(yùn)行時(shí),系統(tǒng)自動(dòng)打開(kāi)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ò)輸出。通常這通常這3個(gè)文件都與終端相聯(lián)系,因此我們所用到的從個(gè)文件都與終端相聯(lián)系,因此我們所用到的從終端輸入或輸出都不需要打開(kāi)終端文件文件。終端輸入或輸出都不需要打開(kāi)終端文件文件。系統(tǒng)自動(dòng)定義了系統(tǒng)自動(dòng)定義了3

18、個(gè)文件指針個(gè)文件指針stdin、stdout和和stderr,分,分別指向終端輸入、終端輸出和標(biāo)準(zhǔn)出錯(cuò)輸出(也從終別指向終端輸入、終端輸出和標(biāo)準(zhǔn)出錯(cuò)輸出(也從終端輸出)。端輸出)。如果程序中指定要從如果程序中指定要從stdin所指的文件輸入數(shù)據(jù),就是所指的文件輸入數(shù)據(jù),就是指從終端鍵盤(pán)輸入數(shù)據(jù)。指從終端鍵盤(pán)輸入數(shù)據(jù)。17關(guān)閉文件關(guān)閉文件u在使用完一個(gè)文件后應(yīng)在使用完一個(gè)文件后應(yīng)關(guān)閉關(guān)閉該文件,以防止它再被該文件,以防止它再被誤用。誤用。u關(guān)閉關(guān)閉就是使文件指針變量不指向該文件,此后不能就是使文件指針變量不指向該文件,此后不能再通過(guò)該指針對(duì)原來(lái)與其相聯(lián)系的文件進(jìn)行讀寫(xiě)操作再通過(guò)該指針對(duì)原來(lái)與其相

19、聯(lián)系的文件進(jìn)行讀寫(xiě)操作。uANSI C規(guī)定了標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù),用規(guī)定了標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù),用 fclose()函數(shù)關(guān)函數(shù)關(guān)閉文件。調(diào)用方式為:閉文件。調(diào)用方式為:fp=fclose(文件指針)(文件指針);例如:例如: fclose(fp);u在程序終止之前應(yīng)關(guān)閉所有文件,否則將會(huì)丟失數(shù)據(jù)在程序終止之前應(yīng)關(guān)閉所有文件,否則將會(huì)丟失數(shù)據(jù)。ufclose函數(shù)帶回一個(gè)值:函數(shù)帶回一個(gè)值:當(dāng)順利地執(zhí)行了關(guān)閉操作,則返回值為當(dāng)順利地執(zhí)行了關(guān)閉操作,則返回值為0;否則返回否則返回-1??梢杂每梢杂胒error函數(shù)函數(shù)來(lái)測(cè)試。來(lái)測(cè)試。18文件的讀寫(xiě)19文件字符輸入輸出函數(shù)文件字符輸入輸出函數(shù)u把一個(gè)字符寫(xiě)

20、到磁盤(pán)文件上去。調(diào)用形式為:把一個(gè)字符寫(xiě)到磁盤(pán)文件上去。調(diào)用形式為: fputc(字符,文件指針)(字符,文件指針);例如:例如: fputc(ch, fp);ufputc函數(shù)帶回一個(gè)值:函數(shù)帶回一個(gè)值:如果輸出成功,則返回值為如果輸出成功,則返回值為輸出的字符輸出的字符;如果輸出失敗,則返回如果輸出失敗,則返回-1。uputchar函數(shù)是從函數(shù)是從fputc函數(shù)派生出來(lái)的。函數(shù)派生出來(lái)的。putchar(c)是在是在stdio.h文件中用預(yù)處理命令文件中用預(yù)處理命令#define定義的定義的宏宏: #define putchar(c) fputc(c, stdout);從用戶角度看,可以把從

21、用戶角度看,可以把putchar(c)看作函數(shù)??醋骱瘮?shù)。20文件字符輸入輸出函數(shù)文件字符輸入輸出函數(shù)u從指定的文件讀入一個(gè)字符,該文件必須是以從指定的文件讀入一個(gè)字符,該文件必須是以讀讀或或讀寫(xiě)讀寫(xiě)方式方式打開(kāi)的。調(diào)用形式為:打開(kāi)的。調(diào)用形式為: ch=fgetc(文件指針)(文件指針);例如:例如: ch=fgetc(fp);ufgetc函數(shù)帶回一個(gè)字符,賦給函數(shù)帶回一個(gè)字符,賦給ch。如果在執(zhí)行如果在執(zhí)行fgetc函數(shù)讀字符時(shí)遇到文件結(jié)束符,函數(shù)返函數(shù)讀字符時(shí)遇到文件結(jié)束符,函數(shù)返回一個(gè)文件結(jié)束標(biāo)志回一個(gè)文件結(jié)束標(biāo)志EOF(-1)。例如:例如: ch=fgetc(fp); while (

22、ch!=EOF) putchar(ch); ch=fgetc(fp); 21uEOF定義為定義為-1,只適用于讀文本文件的情況,不適用于讀二,只適用于讀文本文件的情況,不適用于讀二進(jìn)制文件。進(jìn)制文件。uANSI C提供一個(gè)提供一個(gè)feof函數(shù)函數(shù)來(lái)判斷文件是否真的結(jié)束。來(lái)判斷文件是否真的結(jié)束。feof(fp)用來(lái)測(cè)試用來(lái)測(cè)試fp所指向的文件當(dāng)前狀態(tài)是否為所指向的文件當(dāng)前狀態(tài)是否為文件文件結(jié)束結(jié)束。如果是如果是文件結(jié)束文件結(jié)束,函數(shù)的值為,函數(shù)的值為1(真真),否則為,否則為0(假假) 。例如:例如: while (! feof(fp) ch=fgetc(fp); ufeof函數(shù)既適用于二進(jìn)制文

23、件,也適用于文本文件函數(shù)既適用于二進(jìn)制文件,也適用于文本文件。文件字符輸入輸出函數(shù)文件字符輸入輸出函數(shù)22例:從鍵盤(pán)輸入一些字符,逐個(gè)把它們送到磁盤(pán)上去,直到輸入一個(gè)例:從鍵盤(pán)輸入一些字符,逐個(gè)把它們送到磁盤(pán)上去,直到輸入一個(gè)#為止。為止。 #include stdio.h #include stdlib.h main() FILE *fp; char ch, filename20; scanf(%s, filename); if (fp=fopen(filename, w)=NULL) printf(cannot open filen); exit(0); ch=getchar( ); ch

24、=getchar( ); while (ch!=#) fputc(ch, fp); putchar(ch); ch=getchar( ); fclose(fp); d:tmpfile1.c Computer and c# Computer and c文件字符輸入輸出函數(shù)文件字符輸入輸出函數(shù)23文件字符輸入輸出函數(shù)文件字符輸入輸出函數(shù)將一個(gè)磁盤(pán)文件中的信息讀到屏幕上將一個(gè)磁盤(pán)文件中的信息讀到屏幕上#include stdio.h main() FILE *fp1, *fp2; fp1=fopen(file1.c, r); fp2=fopen(file2.c, w); while ( !feof(

25、fp1) ) putchar(getc(fp1); fclose(fp1);24例:將一個(gè)磁盤(pán)文件中的信息復(fù)制到另一個(gè)磁盤(pán)文件中。例:將一個(gè)磁盤(pán)文件中的信息復(fù)制到另一個(gè)磁盤(pán)文件中。 #include stdio.h #include stdlib.h main() FILE *in, *out; char ch, infile20, outfile20; printf(Enter the infile name:n); scanf(%s, infile); printf(Enter the outfile name:n); scanf(%s, outfile); if (in=fopen(in

26、file, r)=NULL) printf(cannot open infilen); exit(0); if (out=fopen(outfile, w)=NULL) printf(cannot open outfilen); exit(0); while (!feof(in) fputc(fgetc(in), out); fclose(in); fclose(out); Enter the infile name: D:tmpfile1.c Enter the outfile name: D:tmpfile2.c 文件字符輸入輸出函數(shù)文件字符輸入輸出函數(shù)25文件字符串輸入輸出函數(shù)文件字符串

27、輸入輸出函數(shù)uANSI C設(shè)置兩個(gè)函數(shù)設(shè)置兩個(gè)函數(shù)fread和和fwrite,用來(lái)讀寫(xiě)一個(gè)數(shù)據(jù)塊,用來(lái)讀寫(xiě)一個(gè)數(shù)據(jù)塊(一組數(shù)據(jù),如一個(gè)實(shí)數(shù)或一個(gè)結(jié)構(gòu)體變量的值)。它們的(一組數(shù)據(jù),如一個(gè)實(shí)數(shù)或一個(gè)結(jié)構(gòu)體變量的值)。它們的一般調(diào)用形式為:一般調(diào)用形式為: fread(buffer, size, count, fp); fwrite(buffer, size, count, fp);buffer:是一個(gè)指針。對(duì):是一個(gè)指針。對(duì)fread來(lái)說(shuō),它是讀入數(shù)據(jù)的存來(lái)說(shuō),它是讀入數(shù)據(jù)的存放地址放地址;對(duì)對(duì)fwrite來(lái)說(shuō),是要輸出數(shù)據(jù)的起始地址。來(lái)說(shuō),是要輸出數(shù)據(jù)的起始地址。size:要讀寫(xiě)的字節(jié)數(shù)。:要

28、讀寫(xiě)的字節(jié)數(shù)。count:要進(jìn)行讀寫(xiě)多少個(gè):要進(jìn)行讀寫(xiě)多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)字節(jié)的數(shù)據(jù)項(xiàng)。fp:文件型指針。:文件型指針。若函數(shù)調(diào)用成功,則返回值為若函數(shù)調(diào)用成功,則返回值為count的值。的值。u如果文件以二進(jìn)制形式打開(kāi),用如果文件以二進(jìn)制形式打開(kāi),用fread和和fwrite函數(shù)就可以讀函數(shù)就可以讀寫(xiě)任何類(lèi)型的信息,寫(xiě)任何類(lèi)型的信息,如:如: fread(f, 4, 2, fp);26u例:例: struct student_type char name10; int num; int age; char addr30; stu40; for(i=0; i40; i+) fread(&

29、amp;studi, sizeof(struct student_type), 1, fp); for(i=0; i40; i+) fwrite(&studi, sizeof(struct student_type), 1, fp);ufread和和fwrite函數(shù)一般用于二進(jìn)制文件的輸入輸出,因?yàn)樗鼈兪呛瘮?shù)一般用于二進(jìn)制文件的輸入輸出,因?yàn)樗鼈兪前磾?shù)據(jù)塊的長(zhǎng)度來(lái)處理輸入輸出的。在字符發(fā)生轉(zhuǎn)換的情況下很按數(shù)據(jù)塊的長(zhǎng)度來(lái)處理輸入輸出的。在字符發(fā)生轉(zhuǎn)換的情況下很可能出現(xiàn)與原設(shè)想不同的情況??赡艹霈F(xiàn)與原設(shè)想不同的情況。文件字符串輸入輸出函數(shù)文件字符串輸入輸出函數(shù)27例:從鍵盤(pán)輸入例:從鍵盤(pán)輸

30、入4個(gè)學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤(pán)文件上去。個(gè)學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤(pán)文件上去。 #include stdio.h #define SIZE 4 struct student_type char name10; int num; int age; char addr15; studSIZE; main() void save( ); int i; for (i=0; iSIZE; i+) scanf(%s%dn, , &studi.num); scanf(%d%s, &studi.age, studi.addr); save( ); 文件

31、字符串輸入輸出函數(shù)文件字符串輸入輸出函數(shù)28例:從鍵盤(pán)輸入例:從鍵盤(pán)輸入4個(gè)學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤(pán)文件上去。個(gè)學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤(pán)文件上去。 void save( ) FILE *fp; int i; if ( (fp=fopen(stu_list, 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); fcl

32、ose(fp); Zhang 1001 19room_101Fan 1002 20 room_102Tan 1003 21 room_103Ling 1004 21 room_104文件字符串輸入輸出函數(shù)文件字符串輸入輸出函數(shù)29例:從例:從stu_list文件中讀入數(shù)據(jù),然后在屏幕上輸出。文件中讀入數(shù)據(jù),然后在屏幕上輸出。 #include stdio.h #define SIZE 4 struct student_type char name10; int num; int age; char addr15; studSIZE; main() int i; FILE *fp; fp=fop

33、en(stu_list, rb); for (i=0; iSIZE; i+) fread(&studi, sizeof(struct student_type), 1, fp); printf(%-10s %4d, , studi.num); printf(%4d %-15s, studi.age, studi.addr); fclose(fp ); Zhang 1001 19 room_101Fan 1002 20 room_102Tan 1003 21 room_103Ling 1004 21 room_104文件字符串輸入輸出函數(shù)文件字符串輸入輸出函數(shù)30例:

34、從二進(jìn)制文件例:從二進(jìn)制文件stu_dat中讀入數(shù)據(jù),并輸出到中讀入數(shù)據(jù),并輸出到stu_list 文件中去。文件中去。 void load( ) FILE *fp; int i; if ( (fp=fopen(stu_dat, 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 error

35、n); fclose(fp); main( ) load( ); save( ); 文件字符串輸入輸出函數(shù)文件字符串輸入輸出函數(shù)31文件的格式化輸入輸出函數(shù)文件的格式化輸入輸出函數(shù)u函數(shù)函數(shù)fprintf和和fscanf是格式化讀寫(xiě)函數(shù),讀寫(xiě)對(duì)象不是終端是格式化讀寫(xiě)函數(shù),讀寫(xiě)對(duì)象不是終端而是磁盤(pán)文件。它們的一般調(diào)用形式為:而是磁盤(pán)文件。它們的一般調(diào)用形式為: fprintf(文件指針文件指針, 格式字符串格式字符串, 輸出表列輸出表列); fscanf(文件指針文件指針, 格式字符串格式字符串, 輸入表列輸入表列);例如:例如: fprintf(fp, %d, %6.2f, i, t); fs

36、canf(fp, %d, %f, &i, &t);u用用fprintf和和fscanf函數(shù)對(duì)磁盤(pán)文件進(jìn)行讀寫(xiě),使用方便,容函數(shù)對(duì)磁盤(pán)文件進(jìn)行讀寫(xiě),使用方便,容易理解易理解;但由于在輸入時(shí)要將但由于在輸入時(shí)要將ASCII碼轉(zhuǎn)換為二進(jìn)制形式,在碼轉(zhuǎn)換為二進(jìn)制形式,在輸出時(shí)又要將二進(jìn)制形式轉(zhuǎn)換成字符,花費(fèi)時(shí)間比較多。輸出時(shí)又要將二進(jìn)制形式轉(zhuǎn)換成字符,花費(fèi)時(shí)間比較多。u在內(nèi)存與磁盤(pán)頻繁交換數(shù)據(jù)的情況下,最好不用在內(nèi)存與磁盤(pán)頻繁交換數(shù)據(jù)的情況下,最好不用fprintf和和fscanf函數(shù),而用函數(shù),而用fread和和fwrite函數(shù)。函數(shù)。32u函數(shù)函數(shù)putw和和getw,用來(lái)對(duì)磁盤(pán)文

37、件讀寫(xiě)一個(gè)字(整數(shù))。,用來(lái)對(duì)磁盤(pán)文件讀寫(xiě)一個(gè)字(整數(shù))。例如:例如: putw(10, fp); /*將整數(shù)將整數(shù)10輸出到輸出到fp指向的文件指向的文件*/ i=getw(fp); /*從從fp指向的文件中讀一個(gè)整數(shù)到內(nèi)存,賦給整型變量指向的文件中讀一個(gè)整數(shù)到內(nèi)存,賦給整型變量i*/u函數(shù)函數(shù)fgets和和fputs,是從指定文件讀入一個(gè)字符串。,是從指定文件讀入一個(gè)字符串。例如:例如: fgets(str, n, fp); n為要求得到的字符為要求得到的字符;但只從但只從fp指向的文件中輸入指向的文件中輸入n-1個(gè)字個(gè)字符,然后在最后加一個(gè)符,然后在最后加一個(gè)0字符。字符。若在讀完若在讀

38、完n-1個(gè)字符之前遇到換行符或個(gè)字符之前遇到換行符或EOF,讀入即結(jié)束,讀入即結(jié)束。得到的字符放到字符數(shù)組得到的字符放到字符數(shù)組str中。中。函數(shù)返回值為函數(shù)返回值為str的首地址。的首地址。其他讀寫(xiě)函數(shù)其他讀寫(xiě)函數(shù)33其他讀寫(xiě)函數(shù)其他讀寫(xiě)函數(shù)u函數(shù)函數(shù)fputs,作用是向指定文件輸出一個(gè)字符串。,作用是向指定文件輸出一個(gè)字符串。例如:例如: fputs(China, fp); /*將字符串將字符串China輸出到輸出到fp指向的文件指向的文件*/函數(shù)中第一個(gè)參數(shù)可以是字符串常量、字符數(shù)組名或字函數(shù)中第一個(gè)參數(shù)可以是字符串常量、字符數(shù)組名或字符型指針。符型指針。字符串末尾的字符串末尾的0字符不

39、輸出。字符不輸出。若輸出成功,函數(shù)返回值為若輸出成功,函數(shù)返回值為0;失敗時(shí),為失敗時(shí),為EOF(-1)。u函數(shù)函數(shù)fputs和和fgets類(lèi)似于類(lèi)似于puts和和gets函數(shù),只是函數(shù),只是fputs和和fgets函函數(shù)以指定的文件為讀寫(xiě)對(duì)象。數(shù)以指定的文件為讀寫(xiě)對(duì)象。u可以自己編寫(xiě)讀寫(xiě)任何類(lèi)型數(shù)據(jù)的函數(shù)。可以自己編寫(xiě)讀寫(xiě)任何類(lèi)型數(shù)據(jù)的函數(shù)。34文件的定位35 文件定位文件定位uftell函數(shù)的作用是得到流式文件中的當(dāng)前位置,用相函數(shù)的作用是得到流式文件中的當(dāng)前位置,用相對(duì)于文件開(kāi)頭的位移量來(lái)表示。對(duì)于文件開(kāi)頭的位移量來(lái)表示。u如果如果ftell函數(shù)的返回值為函數(shù)的返回值為-1L,表示出錯(cuò)。

40、,表示出錯(cuò)。例如:例如: i=ftell(fp); if (i=-1L) printf(errorn); /*變量變量i 存放當(dāng)前位置存放當(dāng)前位置*/ /*若調(diào)用函數(shù)出錯(cuò),則輸出若調(diào)用函數(shù)出錯(cuò),則輸出error*/36u文件中有一個(gè)位置指針,指向當(dāng)前讀寫(xiě)的位置。文件中有一個(gè)位置指針,指向當(dāng)前讀寫(xiě)的位置。u如果順序讀寫(xiě)一個(gè)文件,每次讀寫(xiě)一個(gè)字符,則讀寫(xiě)完如果順序讀寫(xiě)一個(gè)文件,每次讀寫(xiě)一個(gè)字符,則讀寫(xiě)完一個(gè)字符后,該位置指針自動(dòng)移動(dòng)指向下一個(gè)字符位置一個(gè)字符后,該位置指針自動(dòng)移動(dòng)指向下一個(gè)字符位置??捎糜嘘P(guān)函數(shù)強(qiáng)制使位置指針指向其他指定的位置。可用有關(guān)函數(shù)強(qiáng)制使位置指針指向其他指定的位置。u關(guān)閉關(guān)

41、閉就是使文件指針變量不指向該文件,此后不能再就是使文件指針變量不指向該文件,此后不能再通過(guò)該指針對(duì)原來(lái)與其相聯(lián)系的文件進(jìn)行讀寫(xiě)操作。通過(guò)該指針對(duì)原來(lái)與其相聯(lián)系的文件進(jìn)行讀寫(xiě)操作。urewind()函數(shù)的作用是使位置指針重新返回文件的開(kāi)頭函數(shù)的作用是使位置指針重新返回文件的開(kāi)頭。此函數(shù)沒(méi)有返回值。調(diào)用形式為:。此函數(shù)沒(méi)有返回值。調(diào)用形式為:rewind(文件指針)(文件指針);例如:例如: rewind(fp); 文件定位文件定位37例:有一個(gè)磁盤(pán)文件,第一次將它的內(nèi)容顯示在屏幕上,第二次例:有一個(gè)磁盤(pán)文件,第一次將它的內(nèi)容顯示在屏幕上,第二次把它復(fù)制到另一文件上。把它復(fù)制到另一文件上。 #in

42、clude stdio.h main() FILE *fp1, *fp2; fp1=fopen(file1.c, r); fp2=fopen(file2.c, w); while ( !feof(fp1) ) putchar(getc(fp1); rewind(fp1); while ( !feof(fp1) ) putc(getc(fp1), fp2); fclose(fp1); fclose(fp2); 文件定位文件定位38u對(duì)流式文件可以進(jìn)行順序讀寫(xiě),也可以進(jìn)行隨機(jī)讀寫(xiě)。對(duì)流式文件可以進(jìn)行順序讀寫(xiě),也可以進(jìn)行隨機(jī)讀寫(xiě)。關(guān)鍵在于控制文件的位置指針。關(guān)鍵在于控制文件的位置指針。如果位置指針是

43、按字節(jié)位置順序移動(dòng)的,就是順序如果位置指針是按字節(jié)位置順序移動(dòng)的,就是順序讀寫(xiě)讀寫(xiě);如果能將位置指針按需要移動(dòng)到任意位置,就可以如果能將位置指針按需要移動(dòng)到任意位置,就可以實(shí)現(xiàn)隨機(jī)讀寫(xiě)。實(shí)現(xiàn)隨機(jī)讀寫(xiě)。u所謂隨機(jī)讀寫(xiě),是指讀完上一個(gè)字符(字節(jié))后,并不所謂隨機(jī)讀寫(xiě),是指讀完上一個(gè)字符(字節(jié))后,并不一定要讀寫(xiě)其后續(xù)的字符(字節(jié)),而可以讀寫(xiě)文件中一定要讀寫(xiě)其后續(xù)的字符(字節(jié)),而可以讀寫(xiě)文件中任意所需的字符(字節(jié))。任意所需的字符(字節(jié))。u用用fseek函數(shù)可以實(shí)現(xiàn)改變文件的位置指針。其調(diào)用形式函數(shù)可以實(shí)現(xiàn)改變文件的位置指針。其調(diào)用形式為:為: fseek(文件類(lèi)型指針(文件類(lèi)型指針, 位移量

44、位移量, 起始點(diǎn))起始點(diǎn)); 文件定位文件定位39u調(diào)用形式為:調(diào)用形式為:fseek(文件類(lèi)型指針文件類(lèi)型指針, 位移量位移量, 起始點(diǎn)起始點(diǎn));起始點(diǎn)起始點(diǎn):用:用0、1或或2代替,含義如下:代替,含義如下:位移量位移量:以:以起始點(diǎn)起始點(diǎn)為基點(diǎn),向前移動(dòng)的字節(jié)數(shù)。為基點(diǎn),向前移動(dòng)的字節(jié)數(shù)。ANSI C標(biāo)準(zhǔn)要求位移量是標(biāo)準(zhǔn)要求位移量是long型數(shù)據(jù),規(guī)定在數(shù)字型數(shù)據(jù),規(guī)定在數(shù)字的末尾加一個(gè)的末尾加一個(gè)L,表示該數(shù)字是,表示該數(shù)字是long型型。ufseek函數(shù)一般用于二進(jìn)制文件,因?yàn)槲谋疚募l(fā)生字函數(shù)一般用于二進(jìn)制文件,因?yàn)槲谋疚募l(fā)生字符轉(zhuǎn)換,計(jì)算位置時(shí)往往會(huì)發(fā)生混亂。符轉(zhuǎn)換,計(jì)算位置時(shí)往往會(huì)發(fā)生混亂。起始點(diǎn)起

溫馨提示

  • 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)論