




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
文件文件的基本概念8.1常用文件操作的基本函數(shù)8.28.1文件的基本概念
計(jì)算機(jī)信息系統(tǒng)中,根據(jù)信息的存儲(chǔ)時(shí)間,可以分為臨時(shí)性信息和永久性信息。簡(jiǎn)單來(lái)說(shuō),臨時(shí)信息存儲(chǔ)在計(jì)算機(jī)系統(tǒng)臨時(shí)存儲(chǔ)設(shè)備(例如存儲(chǔ)在計(jì)算機(jī)內(nèi)存),這類(lèi)信息隨系統(tǒng)斷電而丟失。永久性信息存儲(chǔ)在計(jì)算機(jī)的永久性存儲(chǔ)設(shè)備(例如存儲(chǔ)在磁盤(pán)和光盤(pán))。永久性的最小存儲(chǔ)單元為文件,因此文件管理是計(jì)算機(jī)系統(tǒng)中的一個(gè)重要的問(wèn)題。一般來(lái)說(shuō),每臺(tái)計(jì)算機(jī)都有一個(gè)操作系統(tǒng)負(fù)責(zé)管理計(jì)算機(jī)的各種資源。操作系統(tǒng)的文件系統(tǒng)負(fù)責(zé)將外部設(shè)備(如硬盤(pán)、打印機(jī)、光驅(qū)等)的信息組織方式進(jìn)行統(tǒng)一規(guī)劃,提供統(tǒng)一的程序訪(fǎng)問(wèn)數(shù)據(jù)的方法。8.1.1文件概述
對(duì)于操作系統(tǒng)來(lái)說(shuō),文件是存儲(chǔ)在磁盤(pán)上的一個(gè)信息序列,操作系統(tǒng)為這個(gè)信息序列起一個(gè)名稱(chēng),這個(gè)名稱(chēng)就叫做文件名(或文件標(biāo)識(shí)符)。由于文件存儲(chǔ)在外存中,外存的信息相對(duì)于內(nèi)存來(lái)說(shuō)是海量的,而且出于安全、規(guī)范的角度,不能夠允許程序隨意使用外存的信息,因此,當(dāng)程序要使用文件時(shí)必須向操作系統(tǒng)申請(qǐng)使用,操作系統(tǒng)按規(guī)則授權(quán)給程序后程序才可以使用,使用完畢后,程序應(yīng)該通知操作系統(tǒng)。8.1.1文件概述緩沖區(qū):是在內(nèi)存中開(kāi)辟的一段區(qū)域,當(dāng)程序需要從外存中讀取文件數(shù)據(jù)時(shí),系統(tǒng)先讀入足夠多的數(shù)據(jù)到緩沖區(qū)中,然后程序?qū)彌_區(qū)中的數(shù)據(jù)進(jìn)行處理。當(dāng)程序需要寫(xiě)數(shù)據(jù)到外存文件中時(shí),同樣要先把數(shù)據(jù)送入緩沖區(qū)中,等緩沖區(qū)滿(mǎn)了后,再一起存入外存中。所以程序?qū)嶋H上是通過(guò)緩沖區(qū)讀寫(xiě)文件的。數(shù)據(jù)存儲(chǔ)緩沖區(qū)從C語(yǔ)言的角度看,文件實(shí)際上是一個(gè)存儲(chǔ)在外存中的由一串連續(xù)字符(字節(jié))構(gòu)成的任意信息序列,即字符流。C程序需要按照特定的規(guī)則去訪(fǎng)問(wèn)這個(gè)序列。C語(yǔ)言中的文件是邏輯的概念,除了大家熟悉的普通文件外,所有能進(jìn)行輸入輸出的設(shè)備都被看做是文件,如打印機(jī)、磁盤(pán)機(jī)和用戶(hù)終端等。8.1.1文件概述終端文件中有3個(gè)文件是特殊的,每個(gè)C程序都用到。這3個(gè)文件是:標(biāo)準(zhǔn)輸入文件(stdin)對(duì)應(yīng)鍵盤(pán),標(biāo)準(zhǔn)輸出文件(stdout)對(duì)應(yīng)終端屏幕,標(biāo)準(zhǔn)出錯(cuò)信息文件(stderr)對(duì)應(yīng)終端屏幕。這3個(gè)文件對(duì)所有的C程序都是自動(dòng)設(shè)置和打開(kāi)的。當(dāng)程序調(diào)用getchar()和scanf()時(shí),就是從標(biāo)準(zhǔn)輸入文件(鍵盤(pán))讀取信息;調(diào)用putchar()和printf()就是向標(biāo)準(zhǔn)輸出文件(屏幕)輸出信息。8.1.1文件概述8.1.2文件的類(lèi)別對(duì)于操作系統(tǒng)來(lái)說(shuō),文件就是一個(gè)由字節(jié)為單位的信息流序列。如果將C語(yǔ)言涉及的所有數(shù)據(jù)存儲(chǔ)在文件中,必然有一個(gè)約定規(guī)則。一個(gè)整數(shù)存儲(chǔ)在文件中可以有多種方式。如整數(shù)28036存儲(chǔ)在文件可直接存儲(chǔ)2個(gè)字節(jié)0x0B和0x14,也可以直接存儲(chǔ)它的正文方式——‘2’、‘8’、‘0’、‘3’、‘6’。前者稱(chēng)為二進(jìn)制方式,后者稱(chēng)為文本方式(亦稱(chēng)正文方式)。1.文本文件文本文件是一種典型的順序文件,其文件的邏輯結(jié)構(gòu)又屬于流式文件。文本文件是指以ASCII碼方式(也稱(chēng)文本方式)存儲(chǔ)的文件,更確切地說(shuō),英文、數(shù)字等字符存儲(chǔ)的是ASCII碼,而漢字存儲(chǔ)的是機(jī)內(nèi)碼。文本文件中除了存儲(chǔ)文件有效字符信息,包括能用ASCII碼字符表示的回車(chē)、換行等信息外,不能存儲(chǔ)其他任何信息,因此文本文件不能存儲(chǔ)聲音、動(dòng)畫(huà)、圖像、視頻等信息。文本文件是把數(shù)據(jù)當(dāng)做一個(gè)一個(gè)字符存儲(chǔ)起來(lái)的相應(yīng)碼值,在采用ASCII碼的計(jì)算機(jī)系統(tǒng)中存放的就是字符ASCII碼,可見(jiàn)文本文件具有以下的特點(diǎn):(1)方便人工閱讀,并且可以直接采用編輯工具輸入、閱讀、修改文本文件的數(shù)據(jù)。(2)文本文件存儲(chǔ)數(shù)據(jù)無(wú)需太多的規(guī)定,可以將簡(jiǎn)單類(lèi)型的數(shù)據(jù)直接寫(xiě)入到文本文件中,對(duì)于結(jié)構(gòu)等非簡(jiǎn)單數(shù)據(jù)存儲(chǔ)到文本文件中就必須逐個(gè)分量讀寫(xiě)。(3)內(nèi)存中的數(shù)據(jù)存儲(chǔ)形式和存儲(chǔ)到文本文件中的數(shù)據(jù)存儲(chǔ)形式不一致,因此所有需要存儲(chǔ)到文本文件中的數(shù)據(jù)必須先轉(zhuǎn)換為文本,這本身需要時(shí)間。1.文本文件2.二進(jìn)制文件
文件作為信息存儲(chǔ)的一個(gè)基本單位,根據(jù)其存儲(chǔ)信息的方式不同,分為文本文件(又名ASCII文件)和二進(jìn)制文件。如果將存儲(chǔ)的信息采用字符串方式來(lái)保存,那么稱(chēng)此類(lèi)文件為文本文件。如果將存儲(chǔ)的信息嚴(yán)格按其在內(nèi)存中的存儲(chǔ)形式來(lái)保存,則稱(chēng)此類(lèi)文件為二進(jìn)制文件。二進(jìn)制文件是按照數(shù)據(jù)的二進(jìn)制代碼形式直接存入到文件中,二進(jìn)制文件的特點(diǎn):(1)直接將字節(jié)流寫(xiě)入文件,方便快捷。不需要作過(guò)多的轉(zhuǎn)換,節(jié)約時(shí)間、空間。(2)存放到二進(jìn)制文件中的數(shù)據(jù)代碼和內(nèi)存中的數(shù)據(jù)代碼是一致的。(3)可以存儲(chǔ)任意內(nèi)存數(shù)據(jù),只需要將數(shù)據(jù)作為一塊二進(jìn)制序列即可。2.二進(jìn)制文件
8.1.3文件指針在C語(yǔ)言中定義了一個(gè)結(jié)構(gòu)體數(shù)據(jù)類(lèi)型FILE來(lái)描述文件信息,在“stdio.h”中具體的定義如下:typedefstruct{shortleve1;unsignedflags;charfd;unsignedcharhold;shortbsize;unsignedchar*buffer;unsignedchar*curp;unsignedistemp;shorttoken;}FILE;8.1.3文件指針在C語(yǔ)言中用一個(gè)指針變量指向一個(gè)文件,這個(gè)指針?lè)Q為文件指針。引入FILE類(lèi)型之后,就可以定義文件指針了。定義說(shuō)明文件指針的一般形式為:FILE*指針變量標(biāo)識(shí)符;其中FILE應(yīng)為大寫(xiě),它是由系統(tǒng)定義的一個(gè)結(jié)構(gòu),該結(jié)構(gòu)中含有文件名、文件狀態(tài)和文件當(dāng)前位置等信息。在編寫(xiě)源程序時(shí)不必關(guān)心FILE結(jié)構(gòu)的細(xì)節(jié)。例如:FILE*fp;表示fp是指向FILE結(jié)構(gòu)的指針變量,通過(guò)fp即可找存放某個(gè)文件信息的結(jié)構(gòu)變量,然后按結(jié)構(gòu)變量提供的信息找到該文件,實(shí)施對(duì)文件的操作。習(xí)慣上也籠統(tǒng)地把fp稱(chēng)為指向一個(gè)文件的指針。8.1.4文件的操作流程C語(yǔ)言對(duì)緩沖文件系統(tǒng)的使用是通過(guò)一系列庫(kù)函數(shù)來(lái)實(shí)現(xiàn),讀寫(xiě)文件必須遵循一定的步驟。C程序打開(kāi)文件C程序?qū)ξ募M(jìn)行讀寫(xiě)操作系統(tǒng)判斷 C程序發(fā)出關(guān)閉命令
操作系統(tǒng)關(guān)閉文件
文件操作合法
文件操作合法 C程序打開(kāi)失敗執(zhí)行C其它語(yǔ)句文件的使用流程
一般來(lái)講,以f開(kāi)頭的函數(shù)均為文件處理函數(shù)。文件處理函數(shù)可以分為如下幾類(lèi):1)文件打開(kāi)與關(guān)閉函數(shù);2)文件讀寫(xiě)函數(shù);3)文件定位函數(shù);4)文件狀態(tài)跟蹤函數(shù)。8.1.4文件的操作流程8.2常用文件操作的標(biāo)準(zhǔn)函數(shù)標(biāo)準(zhǔn)C定義了文件庫(kù)函數(shù)的原型在<stdio.h>頭文件中。本節(jié)介紹文件的打開(kāi)、讀寫(xiě)及關(guān)閉函數(shù)。8.2.1文件的打開(kāi)與關(guān)閉文件在進(jìn)行讀寫(xiě)操作之前要先打開(kāi),使用完畢要關(guān)閉。所謂打開(kāi)文件,實(shí)際上是建立文件的各種有關(guān)信息,并使文件指針指向該文件,以便進(jìn)行其它操作。關(guān)閉文件則斷開(kāi)指針與文件之間的聯(lián)系,也就禁止再對(duì)該文件進(jìn)行操作。1.打開(kāi)文件
在C語(yǔ)言中,除了3個(gè)標(biāo)準(zhǔn)文件外的所有文件在讀寫(xiě)前都必須顯式的打開(kāi)。文件的打開(kāi)操作是通過(guò)fopen()函數(shù)來(lái)實(shí)現(xiàn)的,此函數(shù)的聲明在“stdio.h”中,函數(shù)原型如下:FILE*fopen(constchar*filename,constchar*mode);函數(shù)返回值——FILE類(lèi)型指針。如果運(yùn)行成功,fopen返回文件的地址,否則返NULL。2.關(guān)閉文件
在C語(yǔ)言中,文件的關(guān)閉是通過(guò)fclose()函數(shù)來(lái)實(shí)現(xiàn)。此函數(shù)的聲明在“stdio.h”中,函數(shù)原型如下:intfclose(FILE*fp);函數(shù)返回值——int類(lèi)型,如果為0,則表示文件關(guān)閉成功,否則表示失敗。fclose()函數(shù)的作用是關(guān)閉已經(jīng)打開(kāi)的文件,要求操作系統(tǒng)將文件句柄fp所代表的文件系統(tǒng)進(jìn)行關(guān)閉?!纠?.1】打開(kāi)名為“aa.txt”的文件,并向文件輸出字符串“hello”,然后關(guān)閉文件,同時(shí)在屏幕上輸出fc1ose的返回值。
8.2.2文本文件的讀寫(xiě)文件打開(kāi)之后,就可以進(jìn)行讀寫(xiě)操作。文件的讀寫(xiě)操作通過(guò)一組庫(kù)函數(shù)實(shí)現(xiàn),分為讀函數(shù)和寫(xiě)函數(shù)。常用的讀寫(xiě)函數(shù)分為如下幾類(lèi):1.字符的讀寫(xiě)2.數(shù)值的讀寫(xiě)3.格式化讀寫(xiě)4.塊的讀寫(xiě)5.字符串的讀寫(xiě)1.字符的讀寫(xiě)fputc()函數(shù)的作用是從當(dāng)前文件位置開(kāi)始向文件輸出一個(gè)字符函數(shù)形式參數(shù)說(shuō)明如下:intc——準(zhǔn)備輸出的字符。FILE*stream——文件地址,為FILE*類(lèi)型變量。函數(shù)返回值——int類(lèi)型。如果返回值為-1(EOF),則表示字符輸出失敗,否則返回值為c,即與輸出的字符相等。fgetc()函數(shù)的作用是從當(dāng)前文件位置讀取一個(gè)字符函數(shù)形式參數(shù)說(shuō)明如下:FILE*stream——用讀寫(xiě)模式和只讀模式打開(kāi)的文件地址,為FILE*類(lèi)型變量。函數(shù)返回值——int類(lèi)型。如果返回值為-1,表示已經(jīng)讀到文件末尾,否則返回讀到的字符。【例8.2】從鍵盤(pán)讀取一行字符,并輸出到“test.txt”文件中,再把該文件內(nèi)容讀出顯示在屏幕上。
1.字符的讀寫(xiě)2.字符串的讀寫(xiě)fgets()函數(shù)的形式參數(shù)如下:char*s——有效內(nèi)存地址,以便可以存儲(chǔ)從文件讀取的字符串。intn——讀取字符串的長(zhǎng)度,確定從文件中讀取多少個(gè)字符。實(shí)質(zhì)上,此函數(shù)從文件中讀取n-1個(gè)字符到當(dāng)前的字符串中,然后自動(dòng)添加字符串結(jié)束符‘\0’。但是如果此文件中一行長(zhǎng)度小于n,則到此行的換行符為止,并將此換行符讀取到字符串中。FILE*stream——文件地址fputs()函數(shù)的形式參數(shù)如下:constchar*s——有效的字符串,此字符串中不包括‘\n’。intn——字符串長(zhǎng)度。實(shí)質(zhì)上,在向文件輸出信息時(shí),并不輸出‘\0’。FILE*stream——文件地址。函數(shù)返回值——整型數(shù)據(jù),如果函數(shù)運(yùn)行成功,則返回0;否則返回EOF?!纠?.3】從test.txt文件中讀入一個(gè)含10個(gè)字符的字符串?!纠?.4】在例8.2中建立的文件test.txt中追加一個(gè)字符串。3.塊的讀寫(xiě)文件輸入輸出函數(shù)中還提供了塊的輸入輸出函數(shù),即將內(nèi)存中的一段信息作為一個(gè)整體進(jìn)行輸入輸出操作,其在“stdio.h”中的函數(shù)原型如下:size_tfread(void*ptr,size_tsize,size_tn,FILE*stream);size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream);其中size_t在“stdio.h”中的定義如下typedefunsignedsize_t;【例8.5】從鍵盤(pán)輸入兩個(gè)學(xué)生數(shù)據(jù),寫(xiě)入一個(gè)文件中,再讀出這兩個(gè)學(xué)生的數(shù)據(jù)顯示在屏幕上。fread()函數(shù)從fp指向的二進(jìn)制文件中,讀入count個(gè)大小為size個(gè)字節(jié)的數(shù)據(jù)塊到buf所指向的內(nèi)存中。如果執(zhí)行成功,則返回實(shí)際讀取的數(shù)據(jù)塊的個(gè)數(shù)。例如,從已經(jīng)打開(kāi)的文件指針fp所指向的文件中讀入10個(gè)長(zhǎng)整數(shù)到數(shù)組longa[20]中,這10個(gè)數(shù)依次存儲(chǔ)到a[9]開(kāi)始的10個(gè)元素位置。3.塊的讀寫(xiě)fwrite()函數(shù)從buf所指向的內(nèi)存中,讀入count個(gè)大小為size個(gè)字節(jié)的數(shù)據(jù)塊寫(xiě)入到fp指向的文件中。如果執(zhí)行成功,則返回實(shí)際寫(xiě)入的數(shù)據(jù)塊的個(gè)數(shù)。例如,將長(zhǎng)整數(shù)數(shù)組a[20]的前10個(gè)元素寫(xiě)入文件f中。if(fwrite(a,sizeof(long),10,f)!=10)printf(”文件寫(xiě)出現(xiàn)錯(cuò)誤!\n”);3.塊的讀寫(xiě)4.格式化讀寫(xiě)1.fprintf()函數(shù)函數(shù)的意義是:將省略號(hào)表示的位置列出的表達(dá)式的值計(jì)算出來(lái)后,按mode中指定的格式輸?shù)接衒p指向的文件中。2.fscanf()函數(shù)函數(shù)的意義:從fp指向的文件中,按mode中指定的格式逐個(gè)讀取文本數(shù)據(jù)轉(zhuǎn)換成指定的數(shù)據(jù)類(lèi)型,附給對(duì)應(yīng)指針指向的存儲(chǔ)單元中?!纠?.6】用fscanf和fprintf函數(shù)完成例8.5的問(wèn)題。8.2.3文件的隨機(jī)訪(fǎng)問(wèn)與定位文件可以理解為一個(gè)完整的數(shù)據(jù)流,因此可以將“數(shù)據(jù)流”分為文件頭、文件尾和文件主體三個(gè)部分。在C語(yǔ)言中通過(guò)FILE類(lèi)型指針描述文件流的位置,因此FILE類(lèi)型指針又稱(chēng)為文件指針。在缺省情況下,文件的讀取是按順序進(jìn)行的。在完成一段信息的讀寫(xiě)之后,文件指針移動(dòng)到其后的位置上準(zhǔn)備讀取下一次讀寫(xiě)。在特殊情況下,需要對(duì)文件進(jìn)行隨機(jī)的讀寫(xiě),即讀取當(dāng)前位置的信息后,并不讀取緊接其后的信息,而是根據(jù)需要讀取特定位置處的信息。為了滿(mǎn)足文件的隨機(jī)讀寫(xiě)操作,C語(yǔ)言中提供了文件指針定位函數(shù)。1.文件定位函數(shù)fseek()函數(shù)原型:intfseek(FILE*stream,longoffs
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于人工智能的文化遺產(chǎn)修復(fù)技術(shù)研究-洞察闡釋
- 變井徑環(huán)空注水泥頂替流動(dòng)及旋流扶正器的改善作用
- 廣西柳州市2025屆高三下學(xué)期高考前適應(yīng)性練習(xí)測(cè)試十六物理試卷(含答案)
- 綠色物流與可持續(xù)發(fā)展-第4篇-洞察闡釋
- 全球綠色制造模式及其對(duì)國(guó)內(nèi)產(chǎn)業(yè)的啟示
- 智能化轉(zhuǎn)型對(duì)民營(yíng)企業(yè)長(zhǎng)期發(fā)展的重要性
- 新質(zhì)生產(chǎn)力賦能物流業(yè)的高質(zhì)量發(fā)展效應(yīng)
- 加強(qiáng)社區(qū)教育支持體系的組織架構(gòu)與人員配置
- 2025至2030年中國(guó)電子式柴油氣缸壓力測(cè)試儀行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 2025至2030年中國(guó)燃油鍋爐波紋內(nèi)膽成型機(jī)行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 票據(jù)業(yè)務(wù)承諾函
- 《-寬容讓生活更美好》
- 國(guó)際貿(mào)易實(shí)務(wù)考試題(附答案)
- 銀行存款自書(shū)遺囑范文
- MSA-測(cè)量系統(tǒng)分析模板
- 下肢深靜脈血栓試題
- 食品產(chǎn)品認(rèn)證管理-地理標(biāo)志產(chǎn)品認(rèn)證
- 2023年山東省春季高考語(yǔ)文模擬卷試題及答案(含答題卡)
- Hirota方法在孤子方程中的應(yīng)用的中期報(bào)告
- 【互聯(lián)網(wǎng)消費(fèi)金融行業(yè)的風(fēng)險(xiǎn)控制研究-以螞蟻花唄為例11000字(論文)】
- 2022-2023學(xué)年仙桃市六年級(jí)數(shù)學(xué)第二學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
評(píng)論
0/150
提交評(píng)論