8- 利用文件進(jìn)行數(shù)據(jù)管理_第1頁
8- 利用文件進(jìn)行數(shù)據(jù)管理_第2頁
8- 利用文件進(jìn)行數(shù)據(jù)管理_第3頁
8- 利用文件進(jìn)行數(shù)據(jù)管理_第4頁
8- 利用文件進(jìn)行數(shù)據(jù)管理_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

教學(xué)內(nèi)容: 第1章:C語言語法基礎(chǔ)第2章:C程序設(shè)計基礎(chǔ)第3章:利用數(shù)組處理同類型的批量數(shù)據(jù)第4章:利用函數(shù)實現(xiàn)模塊化程序設(shè)計第5章:靈活使用指針第6章:結(jié)構(gòu)體、共用體、枚舉類型及其應(yīng)用第7章:常用的三種線性數(shù)據(jù)結(jié)構(gòu)第8章:利用文件進(jìn)行數(shù)據(jù)管理第9章:嵌入式技術(shù)基礎(chǔ)實踐方法C語言程序設(shè)計8.1文件概述8.2文件的打開與關(guān)閉8.3順序讀寫數(shù)據(jù)文件8.4隨機讀寫數(shù)據(jù)文件8.5文件讀寫的出錯檢測【學(xué)習(xí)內(nèi)容】

第8章利用文件進(jìn)行數(shù)據(jù)管理【學(xué)習(xí)目標(biāo)】

1.理解文件的相關(guān)概念;2.掌握文件的打開與關(guān)閉操作方法;3.掌握文件的各種讀寫操作方法;4.掌握文件在數(shù)據(jù)管理中的應(yīng)用。

0x310x320x330x7B

十進(jìn)制數(shù)123對應(yīng)的兩種形式8.1.1文件的分類1、按照文件內(nèi)容分類8.1文件概述

(2)數(shù)據(jù)文件:內(nèi)容不是程序,而是供程序運行時讀寫的數(shù)據(jù)。

(1)程序文件:內(nèi)容是程序代碼,包括.c、.obj、.exe文件等。

操作系統(tǒng)將每一個輸入、輸出設(shè)備都看作一個數(shù)據(jù)文件。例如,鍵盤是輸入文件,顯示器和打印機是輸出文件。

文件是指存儲在外部介質(zhì)(如磁盤等)上數(shù)據(jù)的集合。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理的。在數(shù)據(jù)管理類的程序設(shè)計中,可從文件中讀取數(shù)據(jù),或向文件中寫入數(shù)據(jù)。

2、按照數(shù)據(jù)的組織形式分類

(1)文本文件:也稱ASCII文件,其中的每個字符對應(yīng)一個字節(jié)(ASCII碼)。

(2)二進(jìn)制文件:以內(nèi)存中存儲形式(二進(jìn)制形式)原樣輸出到外存。C語言中,對二進(jìn)制文件的訪問速度比對文本文件的訪問速度快。8.1.2文件緩沖區(qū)8.1文件概述

系統(tǒng)自動地在內(nèi)存中為程序中每一個正在使用的文件開辟一個文件緩沖區(qū)。

內(nèi)存向磁盤輸出數(shù)據(jù):先將數(shù)據(jù)送到內(nèi)存緩沖區(qū),裝滿緩沖區(qū)后再一起送到磁盤。

磁盤向內(nèi)存輸入數(shù)據(jù):先一次從磁盤文件將一批數(shù)據(jù)輸入到內(nèi)存緩沖區(qū),再從緩沖區(qū)逐個將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)。8.1.3文件類型指針8.1文件概述

使用一個文件時,系統(tǒng)將在內(nèi)存中為該文件開辟一個文件信息區(qū),用來存放文件的有關(guān)信息(如文件名、文件狀態(tài)、文件當(dāng)前位置等)。這些信息保存在一個結(jié)構(gòu)體變量中,該結(jié)構(gòu)體類型名由系統(tǒng)聲明為FILE。

例如VC++提供的stdio.h頭文件中有以下的文件類型聲明:

若使fp指向某個文件的文件信息區(qū),則可通過fp訪問該文件。對文件操作之前,須使用FILE定義指向文件的指針變量。例如:FILE*fp;

8.2.1用fopen函數(shù)打開數(shù)據(jù)文件8.2文件的打開與關(guān)閉

fopen函數(shù)的調(diào)用方式:

FILE*fp;//定義FILE類型的指針變量fpfp=fopen(文件名,文件使用方式);

//將fopen函數(shù)返回值(地址)賦給指針變量fp例如:FILE*fp;

fp=fopen("file1",

"r");

//為了讀取文件file1,打開文件,并使fp指向file1文件

對文件的操作一般要先后經(jīng)過打開、讀或?qū)?、關(guān)閉3步。在C語言中,對文件的打開、讀或?qū)憽㈥P(guān)閉等操作都是通過庫函數(shù)來實現(xiàn)的。

(2)實際應(yīng)用:

if((fp=fopen("file1","r"))==NULL)//若打開文件失敗 { printf("不能打開此文件\n"); exit(0);//關(guān)閉文件,終止正在執(zhí)行的程序

}說明:

(1)文件名:雙撇號括起來的字符串、字符數(shù)組名或指向字符串的指針。8.2文件的打開與關(guān)閉

說明:

(3)文件的使用方式及含義8.2.1用fopen函數(shù)打開數(shù)據(jù)文件8.2.2用fclose函數(shù)關(guān)閉數(shù)據(jù)文件8.2文件的打開與關(guān)閉

對文件讀或?qū)懖僮鹘Y(jié)束后,應(yīng)調(diào)用fclose函數(shù)關(guān)閉該文件。若不關(guān)閉而直接退出程序,可能會使文件緩沖區(qū)中未寫入文件的數(shù)據(jù)丟失。

fclose(fp);

//關(guān)閉fp指向的文件(成功,返回0;否則返回文件結(jié)束標(biāo)志EOF)8.3順序讀寫數(shù)據(jù)文件

8.3.1對文件讀寫一個字符從文本文件中讀取一個字符和向文本文件中寫入一個字符的函數(shù):

用fopen函數(shù)打開一個文件后,即可對該文件進(jìn)行順序讀寫或隨機讀寫。

順序讀寫:對文件讀寫數(shù)據(jù)的順序和數(shù)據(jù)在文件中的物理順序一致,是從文件的開頭逐個字符進(jìn)行讀寫。包括:讀寫字符、讀寫字符串、格式化讀寫、數(shù)據(jù)塊讀寫,均通過庫函數(shù)實現(xiàn)。8.3順序讀寫數(shù)據(jù)文件

【例8.1】從鍵盤上輸入一些字符,逐個寫入到指定文件file1.txt中;然后再從該文件中讀取這些字符,并在顯示屏上顯示。8.3.1對文件讀寫一個字符自主學(xué)習(xí):測試文件是否結(jié)束函數(shù)feof(fp):若結(jié)束,返回非0值,否則返回0。8.3.2對文件讀寫一個字符串8.3順序讀寫數(shù)據(jù)文件

從文本文件中讀取一個字符串和向文本文件中寫入一個字符串的函數(shù):8.3順序讀寫數(shù)據(jù)文件

【例8.3】從鍵盤上輸入一個字符串,寫入到指定文件file1.txt中;然后再從該文件中讀取這個字符串,并在顯示屏上顯示。8.3.2對文件讀寫一個字符串8.3.3格式化讀寫文件8.3順序讀寫數(shù)據(jù)文件

scanf函數(shù)和printf函數(shù)是以“終端”為對象的格式化輸入、輸出函數(shù)。

而fscanf函數(shù)和fprintf函數(shù)是以“文件”為對象的格式化輸入、輸出函數(shù)。 fscanf(fp,"%d%f",&i,&j);//格式化讀取文件若文件指針fp指向的文件中有數(shù)據(jù)3和5.8,則從fp指向的文件中分別讀取數(shù)據(jù)3和5.8送給變量i和j。

fprintf(fp,"%d,%f",i,j);//格式化寫入文件把變量i和j的值分別按%d和%f的格式輸出(寫入)到fp指向的文件中。例如:8.3順序讀寫數(shù)據(jù)文件

【例8.4】將學(xué)生的數(shù)據(jù)信息寫入指定文件file1.txt中;然后再從該文件中讀取學(xué)生的數(shù)據(jù)信息,并在顯示屏上顯示。8.3.3格式化讀寫文件8.3.4用二進(jìn)制方式對文件讀寫一組數(shù)據(jù)8.3順序讀寫數(shù)據(jù)文件

使用fscanf函數(shù)和fprintf函數(shù)對磁盤文件進(jìn)行格式化讀寫時,使用方便,但當(dāng)內(nèi)存中的二進(jìn)制文件與磁盤中的文本文件之間頻繁交換數(shù)據(jù)時,比較費時。此時,可改用fread函數(shù)和fwrite函數(shù)以二進(jìn)制方式對文件進(jìn)行讀寫(數(shù)據(jù)塊),數(shù)據(jù)可在內(nèi)存與磁盤文件之間“原封不動、無需轉(zhuǎn)換”地進(jìn)行交換,效率高。例如:

inta[10];fread(a,4,10,fp);//從fp指向的文件中讀取10個4字節(jié)的數(shù)據(jù),存入數(shù)組a中8.3順序讀寫數(shù)據(jù)文件

8.3.4用二進(jìn)制方式對文件讀寫一組數(shù)據(jù)

structStudent { charname[10];//姓名

intstu_ID;//學(xué)號

intage;//年齡

}stu[10];

從磁盤文件中讀取10名學(xué)生的數(shù)據(jù),存入內(nèi)存結(jié)構(gòu)體數(shù)組:

for(i=0;i<10;i++) fread(&stu[i],sizeof(structStudent),1,fp);

將內(nèi)存中10名學(xué)生的數(shù)據(jù)寫入磁盤文件:

for(i=0;i<10;i++)

fwrite(&stu[i],sizeof(structStudent),1,fp);8.3順序讀寫數(shù)據(jù)文件

【例8.5】從鍵盤輸入5名學(xué)生的相關(guān)數(shù)據(jù),然后將它們轉(zhuǎn)存到磁盤文件中,最后再讀取磁盤文件中的數(shù)據(jù),并送顯示屏顯示。8.3.4用二進(jìn)制方式對文件讀寫一組數(shù)據(jù)8.4隨機讀寫數(shù)據(jù)文件

復(fù)習(xí):順序讀寫數(shù)據(jù)文件的方法:(1)用fgetc和fputc函數(shù)對文件讀寫一個字符;(2)用fgets和fputs函數(shù)對文件讀寫一個字符串;(3)用fscanf和fprintf函數(shù)對文件格式化讀寫;(4)用fread和fwrite函數(shù)對文件讀寫一組數(shù)據(jù)(二進(jìn)制方式)

順序讀寫是從文件的開頭逐個字符進(jìn)行讀寫,因此若隨機查找文件中的第i個數(shù)據(jù),順序讀寫效率會很低。此時,可改用隨機讀寫,以提高訪問效率。8.4.1文件位置指示器及其定位8.4隨機讀寫數(shù)據(jù)文件

1、文件位置指示器——用來指示當(dāng)前讀寫的位置

順序讀寫時,文件位置指示器開始指向文件開頭,每讀寫一個字符,文件位置指示器自動移動到下一個字符的位置:

可根據(jù)需要,人為地將文件位置指示器移動到文件的任意位置,從而實現(xiàn)隨機讀寫。8.4隨機讀寫數(shù)據(jù)文件

2、文件位置指示器的定位8.4.1文件位置指示器及其定位3個函數(shù):rewind函數(shù)使位置指示器返回到文件頭、ftell函數(shù)獲取位置指示器當(dāng)前位置、fseek函數(shù)改變當(dāng)前文件位置。

fseek(fp,10L,0);例如:i=ftell(fp);

//獲取文件位置指示器的當(dāng)前位置if(i==-1L)printf("文件位置讀取出錯");//出錯

//將文件位置指示器移到離當(dāng)前位置10個字節(jié)處//將文件位置指示器從文件尾向后退10個字節(jié)//將文件位置指示器移到離文件頭10個字節(jié)處fseek(fp,10L,1);fseek(fp,-10L,2);8.4.2隨機讀寫文件8.4隨機讀寫數(shù)據(jù)文件

【例8.6】從鍵盤輸入5名學(xué)生的相關(guān)數(shù)據(jù),然后將它們轉(zhuǎn)存到磁盤文件中去,最后隨機查詢磁盤文件中的某名學(xué)生的信息,并送顯示屏顯示。8.4隨機讀寫數(shù)據(jù)文件

8.4.2隨機讀寫文件【例8.6】從鍵盤輸入5名學(xué)生的相關(guān)數(shù)據(jù),然后將它們轉(zhuǎn)存到磁盤文件中,最后隨機查詢磁盤文件中的某名學(xué)生的信息,并送顯示屏顯示。8.5文件讀寫的出錯檢測

1、ferror函數(shù)

溫馨提示

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

評論

0/150

提交評論