C語言程序設(shè)計(jì)案例教程-課件10_第1頁
C語言程序設(shè)計(jì)案例教程-課件10_第2頁
C語言程序設(shè)計(jì)案例教程-課件10_第3頁
C語言程序設(shè)計(jì)案例教程-課件10_第4頁
C語言程序設(shè)計(jì)案例教程-課件10_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第10章文件第10章文件1作業(yè)點(diǎn)評請簡述一下結(jié)構(gòu)體和共用體的異同。請分析一下結(jié)構(gòu)體數(shù)組與鏈表的區(qū)別。作業(yè)點(diǎn)評請簡述一下結(jié)構(gòu)體和共用體的異同。2預(yù)習(xí)檢查什么是文件怎么打開和關(guān)閉文件預(yù)習(xí)檢查什么是文件33文件概述重點(diǎn)了解掌握2文件的隨機(jī)讀寫文件的打開與關(guān)閉文件的讀寫1學(xué)習(xí)目標(biāo)3文件概述重點(diǎn)了解掌握2文件的隨機(jī)讀寫文件的打開與關(guān)閉1學(xué)習(xí)4【案例1】-案例描述

新學(xué)年伊始,許多大一新生來校報(bào)道,為了方便對學(xué)生信息的統(tǒng)一管理,校方需要將學(xué)生的相關(guān)信息制作成學(xué)生信息表,存儲到磁盤中。學(xué)生信息表中包含學(xué)號、姓名、年齡、性別四項(xiàng)信息,編程實(shí)現(xiàn)學(xué)生信息表的文本形式存儲和二進(jìn)制形式存儲,并將生成的文件存儲到D盤的Stu文件夾中?!景咐?】-案例描述新學(xué)年伊始,許多大一新生來5【案例1】-案例分析

本案例中學(xué)生信息的存儲不借助既定的表格(如excel),而是將學(xué)生信息直接存儲到文本文件或二進(jìn)制文件中。在進(jìn)行存儲之前,應(yīng)先有文件,因?yàn)橐鎯Φ絻煞N形式的文件中,所以分別創(chuàng)建兩個(gè)文件。在存儲學(xué)生信息時(shí),可以以每位學(xué)生的每一項(xiàng)信息為單位進(jìn)行存儲,也可以構(gòu)造學(xué)生信息結(jié)構(gòu)體,以每位學(xué)生的所有信息為單位進(jìn)行存儲。

在實(shí)現(xiàn)學(xué)生信息存儲之前,需要先了解一下計(jì)算機(jī)中文件及文件存儲的相關(guān)知識,以及針對計(jì)算機(jī)文件的相關(guān)操作,下面將針對所需知識逐一講解?!景咐?】-案例分析本案例中學(xué)生信息的存儲不借6【案例1】-必備知識1計(jì)算機(jī)中的流文件23文件的緩沖區(qū)文件指針45文件的打開與關(guān)閉寫文件6【案例1】-必備知識1計(jì)算機(jī)中的流文件23文件的緩沖區(qū)文件指7計(jì)算機(jī)中的流在C語言中將通過不同輸入/輸出設(shè)備(鍵盤、內(nèi)存、顯示器、網(wǎng)絡(luò)等)之間的數(shù)據(jù)傳輸抽象表述為“流”。源輸入流程序輸出流程序目標(biāo)【案例1】-必備知識計(jì)算機(jī)中的流在C語言中將通過不同輸入/輸出設(shè)備(鍵盤、內(nèi)存、8什么是文件?【案例1】-必備知識什么是文件?【案例1】-必備知識9【案例1】-必備知識文件所謂“文件”一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理的,也就是說,如果想找存放在外部介質(zhì)上的數(shù)據(jù),必須先按文件名找到指定的文件,然后從文件中讀取數(shù)據(jù)?!景咐?】-必備知識文件所謂“文件”一般指存儲在外部介質(zhì)上數(shù)10一個(gè)文件要有唯一的文件標(biāo)識,以便用戶識別和引用。文件標(biāo)識包括3部分,分別為文件路徑、文件名主干和文件后綴。

文件【案例1】-必備知識一個(gè)文件要有唯一的文件標(biāo)識,以便用戶識別和引用。文件標(biāo)識包括11根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為文本文件和二進(jìn)制文件。文件【案例1】-必備知識1、二進(jìn)制文件數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存儲的,如果不加轉(zhuǎn)換地輸出到外存,就是二進(jìn)制文件。

2、文本文件文本文件又稱為ASCII文件,每一個(gè)字節(jié)放一個(gè)字符的ASCII碼。

根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為文本文件和二進(jìn)制文件。文件12文件的緩沖區(qū)ANSIC標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理文件。緩沖文件系統(tǒng)的特點(diǎn)是在內(nèi)存開辟一個(gè)“緩沖區(qū)”,為程序的每一個(gè)文件使用。當(dāng)程序執(zhí)行讀文件操作時(shí),先將一批文件內(nèi)容讀到緩沖區(qū)中,然后再將內(nèi)容從緩沖區(qū)逐個(gè)讀到程序中。當(dāng)程序執(zhí)行寫文件操作時(shí),先將數(shù)據(jù)寫入到緩沖區(qū)中,待緩沖區(qū)裝滿后再將數(shù)據(jù)從緩沖區(qū)一起寫入到磁盤文件中?!景咐?】-必備知識文件的緩沖區(qū)ANSIC標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理文件。緩13文件指針在C語言中,對文件的所有操作都必須依靠文件指針來完成。文件指針的定義格式如下所示:

FILE*變量名;例FILE*fp;【案例1】-必備知識一個(gè)文件指針變量只能指向一個(gè)文件。文件指針在C語言中,對文件的所有操作都必須依靠文件指針來完成14文件的打開與關(guān)閉操作文件之前首先要打開文件,不打開文件就不能對其進(jìn)行讀寫。C語言提供了fopen()函數(shù),該函數(shù)用于打開文件,其返回值類型為文件指針。fopen()函數(shù)的函數(shù)聲明如下: FILE*fopen(char*filename,char*mode);【案例1】-必備知識文件的打開與關(guān)閉操作文件之前首先要打開文件,不打開文件就不能15打開文件并對文件操作結(jié)束后要關(guān)閉文件。關(guān)閉是釋放緩沖區(qū)和其他資源的過程,不關(guān)閉文件就會慢慢耗光系統(tǒng)資源。C語言提供了一個(gè)fclose()函數(shù),該函數(shù)用于關(guān)閉文件,其返回值類型為int類型。fclose()函數(shù)的函數(shù)聲明如下: intfclose(FILE*fp);【案例1】-必備知識文件的打開與關(guān)閉打開文件并對文件操作結(jié)束后要關(guān)閉文件。關(guān)閉是釋放緩沖區(qū)和其他16用fopen()函數(shù)打開文件,需要確定文件的打開模式。文件常用的打開模式如下表所示?!景咐?】-必備知識文件的打開與關(guān)閉打開模式名稱描述r/rb只讀模式以只讀的形式打開一個(gè)文本文件/二進(jìn)制文件,如果文件不存在或無法找到,fopen()函數(shù)調(diào)用失敗,返回NULLw/wb只寫模式以只寫的形式創(chuàng)建一個(gè)文本文件/二進(jìn)制文件,如果文件已存在,重寫文件a/ab追加模式以只寫的形式打開一個(gè)文本文件/二進(jìn)制文件,只允許在該文件末尾追加數(shù)據(jù),如果文件不存在,則創(chuàng)建新文件r+/rb+讀取/更新模式以讀/寫的形式打開一個(gè)文本文件/二進(jìn)制文件,如果文件不存在,fopen()函數(shù)調(diào)用失敗,返回NULL

w+/wb+寫入/更新模式以讀/寫的形式創(chuàng)建一個(gè)文本文件/二進(jìn)制文件,如果文件已存在,則重寫文件a+ab+追加/更新模式打開一個(gè)文本/二進(jìn)制文件,允許進(jìn)行讀取操作,但只允許在文件末尾添加數(shù)據(jù),若文件不存在,則創(chuàng)建新文件用fopen()函數(shù)打開文件,需要確定文件的打開模式。文件常17(1)、寫文本文件fputc()函數(shù)用于向文件中寫入一個(gè)字符,其語法格式如下:寫文件 intfputc(charch,FILE*fp);【案例1】-必備知識ch表示寫入的內(nèi)容,fp表示一個(gè)文件指針,int表示函數(shù)返回值的類型為整數(shù)類型。(1)、寫文本文件寫文件 intfputc(charch18寫文件(1)、寫文本文件fputs()函數(shù)將字符串寫入文件,其函數(shù)聲明如下: intfputs(constchar*str,FILE*file);【案例1】-必備知識參數(shù)str表示指向待寫入的字符串的字符指針;參數(shù)file表示文件指針,該指針指向需要寫入字符串的文件;返回值類型int類型表示函數(shù)返回值的類型為整型。寫文件(1)、寫文本文件 intfputs(constc19寫文件(2)、寫二進(jìn)制文件fwrite()函數(shù)用于以二進(jìn)制的形式將數(shù)據(jù)寫入文件,其函數(shù)聲明如下: unsignedintfwrite(constvoid*str,unsignedintsize,

unsignedintcount,FILE*file);【案例1】-必備知識參數(shù)str為指向待寫入數(shù)據(jù)的指針;size為待寫入數(shù)據(jù)的字節(jié)數(shù);count為待寫入size個(gè)字節(jié)的數(shù)據(jù)的個(gè)數(shù);file為文件指針,該指針指向需要寫入字符的文件;返回值類型unsignedint型表示函數(shù)返回值的類型為無符號整型。寫文件(2)、寫二進(jìn)制文件 unsignedintfwr20寫文件(2)、寫二進(jìn)制文件fprintf()函數(shù)用于格式化輸出數(shù)據(jù)到文件,其函數(shù)聲明如下:

intfprintf(FILE*file,constchar*format,...);【案例1】-必備知識參數(shù)file表示文件指針,該指針指向需要寫入字符串的文件;參數(shù)format表示以什么樣的字符串格式輸出到文件中;返回值類型int型表示函數(shù)返回值的類型為整型。寫文件(2)、寫二進(jìn)制文件 intfprintf(FILE21【案例1】-案例實(shí)現(xiàn)案例代碼(詳見教材代碼實(shí)現(xiàn))案例設(shè)計(jì)123打開一個(gè)文本文件;45調(diào)用fputs()函數(shù)、fputc()函數(shù)和fwrite()函數(shù)寫入數(shù)據(jù);調(diào)用fclose()函數(shù)關(guān)閉文件;打開一個(gè)二進(jìn)制文件;調(diào)用fputs()函數(shù)、fputc()函數(shù)和fprintf()函數(shù)向其中寫入數(shù)據(jù);6調(diào)用fclose()函數(shù)關(guān)閉文件;【案例1】-案例實(shí)現(xiàn)案例代碼(詳見教材代碼實(shí)現(xiàn))案例設(shè)計(jì)1222【案例2】-案例描述

信息的存儲是為了方便對信息的重復(fù)使用。一般對信息的操作包含增加、刪除、修改和查詢這四項(xiàng),這四項(xiàng)操作都基于已存在的文件。本案例的目標(biāo)是實(shí)現(xiàn)學(xué)生信息的讀取,要求從案例1生成的文件中,讀取學(xué)生信息,輸出到屏幕上?!景咐?】-案例描述信息的存儲是為了方便對信息的23【案例2】-案例分析

本案例的實(shí)現(xiàn)基于案例1中已存在的文件,通過案例1的學(xué)習(xí)可知,在對文件進(jìn)行操作之前需要先打開文件,之后才能逐一讀取文件中的內(nèi)容。案例1中生成了兩個(gè)文件,一個(gè)為文本文件,一個(gè)為二進(jìn)制文件,因?yàn)槠浯娣判问讲煌栽诖蜷_時(shí)需要使用不同的打開模式。【案例2】-案例分析本案例的實(shí)現(xiàn)基于案例1中已24【案例2】-必備知識1讀文件文件位置指針2【案例2】-必備知識1讀文件文件位置指針225(1)、讀文本文件fgetc()函數(shù)用于讀取文件的字符,其語法格式如下:讀文件 charfgetc(FILE*fp);【案例2】-必備知識參數(shù)fp表示一個(gè)文件指針變量,char表示函數(shù)返回值的類型為字符類型。(1)、讀文本文件讀文件 charfgetc(FILE*26讀文件(1)、讀文本文件fgets()函數(shù)用于從文件中讀取一行字符串,或讀取指定長度的字符串,其函數(shù)聲明如下: char*fgets(char*buf,intmaxCount,FILE*file);【案例2】-必備知識參數(shù)buf指向用來存儲文件數(shù)據(jù)的數(shù)組的地址;參數(shù)maxCount指明存儲數(shù)據(jù)的大??;參數(shù)file是將要讀取的文件的文件指針。返回值類型char*型表示函數(shù)返回值的類型是字符型指針。讀文件(1)、讀文本文件 char*fgets(char27讀文件(2)、讀二進(jìn)制文件fread()函數(shù)用于在程序中以二進(jìn)制的形式來讀取文件,其函數(shù)聲明如下:

unsignedintfread(void*dstBuf,unsignedintelementSize,

unsignedintcount,FILE*file);【案例2】-必備知識參數(shù)dstBuf表示指向要接收數(shù)據(jù)的內(nèi)存空間的指針;參數(shù)elementSize表示接收的數(shù)據(jù)項(xiàng)的字節(jié)數(shù);參數(shù)count表示每次函數(shù)運(yùn)行時(shí)要讀取的數(shù)據(jù)項(xiàng)的個(gè)數(shù),每個(gè)數(shù)據(jù)項(xiàng)是elementSize個(gè)字節(jié);參數(shù)file表示文件指針,該指針指向需要寫入字符的文件;返回值類型unsignedint型表示函數(shù)返回值的類型為無符號整型。讀文件(2)、讀二進(jìn)制文件 unsignedintfre28(2)、讀二進(jìn)制文件fscanf()函數(shù)用于從文件中格式化讀取數(shù)據(jù),其函數(shù)聲明如下:

intfscanf(FILE*file,constchar*format,...);讀文件【案例2】-必備知識參數(shù)file表示文件指針,該指針指向需要讀取字符串的文件;參數(shù)format表示文件中的字符串以什么樣的格式輸入到程序中;返回值類型int型表示函數(shù)返回值的類型為整型。(2)、讀二進(jìn)制文件 intfscanf(FILE*f291、rewind()函數(shù)rewind()函數(shù)的作用是將文件位置指針指向文件開頭,該函數(shù)的定義的語法格式如下所示:文件位置指針

voidrewind(FILE*fp);【案例2】-必備知識1、rewind()函數(shù)文件位置指針 voidrewind302、fseek()函數(shù)fseek()函數(shù)的作用是將文件位置指針指向指定位置,該函數(shù)定義的語法格式如下所示:文件位置指針

intfseek(FILE*fp,longoffset,intorigin);【案例2】-必備知識參數(shù)origin的值有三個(gè),具體如下:●SEEK_SET:對應(yīng)的數(shù)字值為0,表示從文件開頭進(jìn)行偏移;●SEEK_CUR:對應(yīng)的數(shù)字值為1,相對于當(dāng)前位置進(jìn)行偏移;●SEEK_END:對應(yīng)的數(shù)字值為2,相對于文件末尾進(jìn)行偏移。2、fseek()函數(shù)文件位置指針 intfseek(FI313、ftell()函數(shù)ftell()函數(shù)的作用是獲取文件位置指針的當(dāng)前位置,該函數(shù)定義的語法格式如下所示:文件位置指針

longftell(FILE*fp);【案例2】-必備知識ftell()函數(shù)調(diào)用成功后,返回文件位置指針的當(dāng)前位置,但如果當(dāng)文件不存在或發(fā)生其他錯(cuò)誤時(shí),則函數(shù)的返回值為-1L。3、ftell()函數(shù)文件位置指針 longftell(F32【案例2】-案例實(shí)現(xiàn)案例代碼(詳見教材代碼實(shí)現(xiàn))案例設(shè)計(jì)

讀取文件之前應(yīng)保證文件已經(jīng)存在,本案例設(shè)計(jì)讀取案例1中生成的文件。文件讀取時(shí)同樣需要打開和關(guān)閉,本案例中將使用不同的打開模式打開文本文件和二進(jìn)制文件,之后分別使用fgetc()和fscanf()函數(shù)獲取文本文件中的內(nèi)容,使用fread()函數(shù)讀取二進(jìn)制文件中的內(nèi)容?!景咐?】-案例實(shí)現(xiàn)案例代碼(詳見教材代碼實(shí)現(xiàn))案例設(shè)計(jì)33【案例3】-案例描述

編程實(shí)現(xiàn)學(xué)生成績的存儲和刪除,具體要求如下:

(1)根據(jù)輸入的路徑和文件名創(chuàng)建或打開文件,通過輸入設(shè)備輸入多條學(xué)生信息,將輸入的學(xué)生信息保存到磁盤文件中;

(2)根據(jù)用戶輸入的學(xué)生姓名,刪除成績表中對應(yīng)的記錄?!景咐?】-案例描述編程實(shí)現(xiàn)學(xué)生成績的存儲和刪除,34【案例3】-案例分析

存儲一條信息的方法在案例1中已經(jīng)實(shí)現(xiàn),本案例中需要實(shí)現(xiàn)的是存儲多條信息到文件中,與案例1的不同在于在打開和關(guān)閉文件之間將會進(jìn)行多次寫操作。

刪除信息的基本方法是:將文件中的數(shù)據(jù)讀到輔助變量中,檢測輔助變量中是否包含要?jiǎng)h除的信息,如果有,則刪除此條信息,然后以重寫的方式打開文件,使用輔助變量中的數(shù)據(jù)覆蓋原文件中的數(shù)據(jù)。

經(jīng)過以上分析可知,刪除學(xué)生信息的主要步驟依然是文件信息的讀寫。文件信息的讀寫方式在案例1和案例2中已經(jīng)學(xué)習(xí),本案例不再贅述?!景咐?】-案例分析存儲一條信息的方法在案例135【案例3】-案例實(shí)現(xiàn)案例設(shè)計(jì)信息的寫入和存儲123構(gòu)造學(xué)生結(jié)構(gòu)體,結(jié)構(gòu)體中包含學(xué)生姓名和成績;使用追加方式打開一個(gè)二進(jìn)制文件,將結(jié)構(gòu)體數(shù)組中的數(shù)據(jù)逐條寫入文件中;定義一個(gè)學(xué)生結(jié)構(gòu)體變量數(shù)組,保存寫入的每一條學(xué)生信息;【案例3】-案例實(shí)現(xiàn)案例設(shè)計(jì)123構(gòu)造學(xué)生結(jié)構(gòu)體,結(jié)構(gòu)體中包36【案例3】-案例實(shí)現(xiàn)案例設(shè)計(jì)信息的寫入和存儲123由用戶輸入一個(gè)學(xué)生姓名;45以重寫的方式打開文件,將數(shù)組中的信息寫入文件,之后關(guān)閉文件。檢測數(shù)組中是否包含要?jiǎng)h除的信息,作相應(yīng)處理;查找學(xué)生信息;打開文件,將文件中信息存儲到結(jié)構(gòu)體數(shù)組中,關(guān)閉文件;案例代碼(詳見教材代碼實(shí)現(xiàn))【案例3】-案例實(shí)現(xiàn)案例設(shè)計(jì)123由用戶輸入一個(gè)學(xué)生姓名;437【案例4】-案例描述

近些年來,因?yàn)樾畔⑿孤对斐韶?cái)產(chǎn)損失的事件時(shí)有發(fā)生。隨著科技的發(fā)展,信息的傳播與獲取越來越方便,為了防止因信息泄露造成的各種危機(jī),信息加密技術(shù)應(yīng)得到充分的重視。本案例要求設(shè)計(jì)程序,對已經(jīng)存在的文件進(jìn)行加密和解密?!景咐?】-案例描述近些年來,因?yàn)樾畔⑿孤对斐?8【案例4】-案例分析

文件加密的目的是保證信息的安全,加密的原理是根據(jù)某種原則,對源文件中的信息進(jìn)行修改,使加密后的文件在與源文件仍保持聯(lián)系的情況下,不會直接反映出源文件中存儲的信息,并且加密后的文件能根據(jù)某種原則,還原出源文件的內(nèi)容。【案例4】-案例分析文件加密的目的是保證信息的39【案例4】-案例實(shí)現(xiàn)案例設(shè)計(jì)

根據(jù)案例分析,本案例中的文件可分為三個(gè):源文件,加密文件和解密后的文件。

使用異或的方式對源文件進(jìn)行加密。為了保證源文件的完整,這里將加密后的信息存放到新的文件中,所以將運(yùn)算的結(jié)果存儲到加密文件。

若要根據(jù)加密文件獲取源文件中存儲的信息,需要逐個(gè)讀取加密文件中的字符,使其與密碼再次異或,獲取解密后的信息。案例代碼(詳見教材代碼實(shí)現(xiàn))【案例4】-案例實(shí)現(xiàn)案例設(shè)計(jì)案例代碼(詳見教材代碼實(shí)現(xiàn))40【案例5】-案例描述

隨著科技的發(fā)展,計(jì)算機(jī)的普及,計(jì)算機(jī)軟件在諸多領(lǐng)域都得到了廣泛的應(yīng)用。如今,管理系統(tǒng)不再是大公司的專利,許多小型的管理系統(tǒng),如餐廳的餐飲管理系統(tǒng)、超市的收銀系統(tǒng)、學(xué)校的學(xué)生選課系統(tǒng)等都已逐步普及到了我們的生活中。

本案例要求實(shí)現(xiàn)一個(gè)基于單鏈表的圖書管理系統(tǒng),該系統(tǒng)可實(shí)現(xiàn)圖書信息的增加、瀏覽、查詢、更新、刪除這五項(xiàng)功能,并能將鏈表中存儲的數(shù)據(jù)保存到文件中?!景咐?】-案例描述隨著科技的發(fā)展,計(jì)算機(jī)的普41【案例5】-案例分析

本案例要求實(shí)現(xiàn)基于單鏈表的圖書管理系統(tǒng),并能實(shí)現(xiàn)增刪改查這幾項(xiàng)基本功能。第9章的案例6對單鏈表的定義與基礎(chǔ)操作進(jìn)行了詳細(xì)地講解,掌握單鏈表的基礎(chǔ)操作是完成本案例的前提。另外圖書信息應(yīng)包含多項(xiàng)數(shù)據(jù),所以鏈表結(jié)點(diǎn)中應(yīng)為結(jié)構(gòu)體類型的數(shù)據(jù)。當(dāng)需要將鏈表中的數(shù)據(jù)保存到本地時(shí),可以使用文件讀寫將數(shù)據(jù)寫入創(chuàng)建的文件中?!景咐?】-案例分析本案例要求實(shí)現(xiàn)基于單鏈表的42【案例5】-案例實(shí)現(xiàn)案例設(shè)計(jì)

功能函數(shù)設(shè)計(jì)如下:123圖書信息錄入。該函數(shù)應(yīng)實(shí)現(xiàn)增加數(shù)據(jù)的功能,其實(shí)質(zhì)為鏈表結(jié)點(diǎn)的添加;45圖書信息刪除。該函數(shù)借助查詢功能,查找鏈表中的數(shù)據(jù),并刪除;圖書信息查詢。該函數(shù)應(yīng)能根據(jù)用戶輸入的某項(xiàng)信息,查找記錄并輸出;圖書信息修改。該函數(shù)應(yīng)能根據(jù)用戶輸入的某項(xiàng)信息,修改信息并保存;圖書信息瀏覽。該函數(shù)應(yīng)實(shí)現(xiàn)鏈表中書籍信息的輸出,其實(shí)質(zhì)為鏈表的遍歷;【案例5】-案例實(shí)現(xiàn)案例設(shè)計(jì)123圖書信息錄入。該函數(shù)應(yīng)實(shí)43【案例5】-案例實(shí)現(xiàn)案例設(shè)計(jì)

功能函數(shù)設(shè)計(jì)如下:678圖書信息保存。該函數(shù)應(yīng)能將鏈表中的數(shù)據(jù)寫入文件;菜單函數(shù)。本函數(shù)可展示功能菜單,提供用戶與程序交互的入口;創(chuàng)建書單;案例代碼(詳見教材代碼實(shí)現(xiàn))【案例5】-案例實(shí)現(xiàn)案例設(shè)計(jì)678圖書信息保存。該函數(shù)應(yīng)能44本章主要講解C語言中文件的相關(guān)概念,包括計(jì)算機(jī)中的流、文件的定義、文件的緩沖區(qū)、文件指針、文件的位置指針等,同時(shí)也講解了文件的相關(guān)操作,如文件的打開與關(guān)閉、文件的讀寫、文件中信息的刪除等。通過本章的學(xué)習(xí),讀者應(yīng)掌握C語言中文件的基本知識與初級操作方式,并能夠使用C語言代碼操作文件。

本章小結(jié)本章主要講解C語言中文件的相關(guān)概念,包括計(jì)算機(jī)中的流、文件的45C語言程序設(shè)計(jì)案例教程-課件10第10章文件第10章文件47作業(yè)點(diǎn)評請簡述一下結(jié)構(gòu)體和共用體的異同。請分析一下結(jié)構(gòu)體數(shù)組與鏈表的區(qū)別。作業(yè)點(diǎn)評請簡述一下結(jié)構(gòu)體和共用體的異同。48預(yù)習(xí)檢查什么是文件怎么打開和關(guān)閉文件預(yù)習(xí)檢查什么是文件493文件概述重點(diǎn)了解掌握2文件的隨機(jī)讀寫文件的打開與關(guān)閉文件的讀寫1學(xué)習(xí)目標(biāo)3文件概述重點(diǎn)了解掌握2文件的隨機(jī)讀寫文件的打開與關(guān)閉1學(xué)習(xí)50【案例1】-案例描述

新學(xué)年伊始,許多大一新生來校報(bào)道,為了方便對學(xué)生信息的統(tǒng)一管理,校方需要將學(xué)生的相關(guān)信息制作成學(xué)生信息表,存儲到磁盤中。學(xué)生信息表中包含學(xué)號、姓名、年齡、性別四項(xiàng)信息,編程實(shí)現(xiàn)學(xué)生信息表的文本形式存儲和二進(jìn)制形式存儲,并將生成的文件存儲到D盤的Stu文件夾中?!景咐?】-案例描述新學(xué)年伊始,許多大一新生來51【案例1】-案例分析

本案例中學(xué)生信息的存儲不借助既定的表格(如excel),而是將學(xué)生信息直接存儲到文本文件或二進(jìn)制文件中。在進(jìn)行存儲之前,應(yīng)先有文件,因?yàn)橐鎯Φ絻煞N形式的文件中,所以分別創(chuàng)建兩個(gè)文件。在存儲學(xué)生信息時(shí),可以以每位學(xué)生的每一項(xiàng)信息為單位進(jìn)行存儲,也可以構(gòu)造學(xué)生信息結(jié)構(gòu)體,以每位學(xué)生的所有信息為單位進(jìn)行存儲。

在實(shí)現(xiàn)學(xué)生信息存儲之前,需要先了解一下計(jì)算機(jī)中文件及文件存儲的相關(guān)知識,以及針對計(jì)算機(jī)文件的相關(guān)操作,下面將針對所需知識逐一講解?!景咐?】-案例分析本案例中學(xué)生信息的存儲不借52【案例1】-必備知識1計(jì)算機(jī)中的流文件23文件的緩沖區(qū)文件指針45文件的打開與關(guān)閉寫文件6【案例1】-必備知識1計(jì)算機(jī)中的流文件23文件的緩沖區(qū)文件指53計(jì)算機(jī)中的流在C語言中將通過不同輸入/輸出設(shè)備(鍵盤、內(nèi)存、顯示器、網(wǎng)絡(luò)等)之間的數(shù)據(jù)傳輸抽象表述為“流”。源輸入流程序輸出流程序目標(biāo)【案例1】-必備知識計(jì)算機(jī)中的流在C語言中將通過不同輸入/輸出設(shè)備(鍵盤、內(nèi)存、54什么是文件?【案例1】-必備知識什么是文件?【案例1】-必備知識55【案例1】-必備知識文件所謂“文件”一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理的,也就是說,如果想找存放在外部介質(zhì)上的數(shù)據(jù),必須先按文件名找到指定的文件,然后從文件中讀取數(shù)據(jù)?!景咐?】-必備知識文件所謂“文件”一般指存儲在外部介質(zhì)上數(shù)56一個(gè)文件要有唯一的文件標(biāo)識,以便用戶識別和引用。文件標(biāo)識包括3部分,分別為文件路徑、文件名主干和文件后綴。

文件【案例1】-必備知識一個(gè)文件要有唯一的文件標(biāo)識,以便用戶識別和引用。文件標(biāo)識包括57根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為文本文件和二進(jìn)制文件。文件【案例1】-必備知識1、二進(jìn)制文件數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存儲的,如果不加轉(zhuǎn)換地輸出到外存,就是二進(jìn)制文件。

2、文本文件文本文件又稱為ASCII文件,每一個(gè)字節(jié)放一個(gè)字符的ASCII碼。

根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為文本文件和二進(jìn)制文件。文件58文件的緩沖區(qū)ANSIC標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理文件。緩沖文件系統(tǒng)的特點(diǎn)是在內(nèi)存開辟一個(gè)“緩沖區(qū)”,為程序的每一個(gè)文件使用。當(dāng)程序執(zhí)行讀文件操作時(shí),先將一批文件內(nèi)容讀到緩沖區(qū)中,然后再將內(nèi)容從緩沖區(qū)逐個(gè)讀到程序中。當(dāng)程序執(zhí)行寫文件操作時(shí),先將數(shù)據(jù)寫入到緩沖區(qū)中,待緩沖區(qū)裝滿后再將數(shù)據(jù)從緩沖區(qū)一起寫入到磁盤文件中?!景咐?】-必備知識文件的緩沖區(qū)ANSIC標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理文件。緩59文件指針在C語言中,對文件的所有操作都必須依靠文件指針來完成。文件指針的定義格式如下所示:

FILE*變量名;例FILE*fp;【案例1】-必備知識一個(gè)文件指針變量只能指向一個(gè)文件。文件指針在C語言中,對文件的所有操作都必須依靠文件指針來完成60文件的打開與關(guān)閉操作文件之前首先要打開文件,不打開文件就不能對其進(jìn)行讀寫。C語言提供了fopen()函數(shù),該函數(shù)用于打開文件,其返回值類型為文件指針。fopen()函數(shù)的函數(shù)聲明如下: FILE*fopen(char*filename,char*mode);【案例1】-必備知識文件的打開與關(guān)閉操作文件之前首先要打開文件,不打開文件就不能61打開文件并對文件操作結(jié)束后要關(guān)閉文件。關(guān)閉是釋放緩沖區(qū)和其他資源的過程,不關(guān)閉文件就會慢慢耗光系統(tǒng)資源。C語言提供了一個(gè)fclose()函數(shù),該函數(shù)用于關(guān)閉文件,其返回值類型為int類型。fclose()函數(shù)的函數(shù)聲明如下: intfclose(FILE*fp);【案例1】-必備知識文件的打開與關(guān)閉打開文件并對文件操作結(jié)束后要關(guān)閉文件。關(guān)閉是釋放緩沖區(qū)和其他62用fopen()函數(shù)打開文件,需要確定文件的打開模式。文件常用的打開模式如下表所示?!景咐?】-必備知識文件的打開與關(guān)閉打開模式名稱描述r/rb只讀模式以只讀的形式打開一個(gè)文本文件/二進(jìn)制文件,如果文件不存在或無法找到,fopen()函數(shù)調(diào)用失敗,返回NULLw/wb只寫模式以只寫的形式創(chuàng)建一個(gè)文本文件/二進(jìn)制文件,如果文件已存在,重寫文件a/ab追加模式以只寫的形式打開一個(gè)文本文件/二進(jìn)制文件,只允許在該文件末尾追加數(shù)據(jù),如果文件不存在,則創(chuàng)建新文件r+/rb+讀取/更新模式以讀/寫的形式打開一個(gè)文本文件/二進(jìn)制文件,如果文件不存在,fopen()函數(shù)調(diào)用失敗,返回NULL

w+/wb+寫入/更新模式以讀/寫的形式創(chuàng)建一個(gè)文本文件/二進(jìn)制文件,如果文件已存在,則重寫文件a+ab+追加/更新模式打開一個(gè)文本/二進(jìn)制文件,允許進(jìn)行讀取操作,但只允許在文件末尾添加數(shù)據(jù),若文件不存在,則創(chuàng)建新文件用fopen()函數(shù)打開文件,需要確定文件的打開模式。文件常63(1)、寫文本文件fputc()函數(shù)用于向文件中寫入一個(gè)字符,其語法格式如下:寫文件 intfputc(charch,FILE*fp);【案例1】-必備知識ch表示寫入的內(nèi)容,fp表示一個(gè)文件指針,int表示函數(shù)返回值的類型為整數(shù)類型。(1)、寫文本文件寫文件 intfputc(charch64寫文件(1)、寫文本文件fputs()函數(shù)將字符串寫入文件,其函數(shù)聲明如下: intfputs(constchar*str,FILE*file);【案例1】-必備知識參數(shù)str表示指向待寫入的字符串的字符指針;參數(shù)file表示文件指針,該指針指向需要寫入字符串的文件;返回值類型int類型表示函數(shù)返回值的類型為整型。寫文件(1)、寫文本文件 intfputs(constc65寫文件(2)、寫二進(jìn)制文件fwrite()函數(shù)用于以二進(jìn)制的形式將數(shù)據(jù)寫入文件,其函數(shù)聲明如下: unsignedintfwrite(constvoid*str,unsignedintsize,

unsignedintcount,FILE*file);【案例1】-必備知識參數(shù)str為指向待寫入數(shù)據(jù)的指針;size為待寫入數(shù)據(jù)的字節(jié)數(shù);count為待寫入size個(gè)字節(jié)的數(shù)據(jù)的個(gè)數(shù);file為文件指針,該指針指向需要寫入字符的文件;返回值類型unsignedint型表示函數(shù)返回值的類型為無符號整型。寫文件(2)、寫二進(jìn)制文件 unsignedintfwr66寫文件(2)、寫二進(jìn)制文件fprintf()函數(shù)用于格式化輸出數(shù)據(jù)到文件,其函數(shù)聲明如下:

intfprintf(FILE*file,constchar*format,...);【案例1】-必備知識參數(shù)file表示文件指針,該指針指向需要寫入字符串的文件;參數(shù)format表示以什么樣的字符串格式輸出到文件中;返回值類型int型表示函數(shù)返回值的類型為整型。寫文件(2)、寫二進(jìn)制文件 intfprintf(FILE67【案例1】-案例實(shí)現(xiàn)案例代碼(詳見教材代碼實(shí)現(xiàn))案例設(shè)計(jì)123打開一個(gè)文本文件;45調(diào)用fputs()函數(shù)、fputc()函數(shù)和fwrite()函數(shù)寫入數(shù)據(jù);調(diào)用fclose()函數(shù)關(guān)閉文件;打開一個(gè)二進(jìn)制文件;調(diào)用fputs()函數(shù)、fputc()函數(shù)和fprintf()函數(shù)向其中寫入數(shù)據(jù);6調(diào)用fclose()函數(shù)關(guān)閉文件;【案例1】-案例實(shí)現(xiàn)案例代碼(詳見教材代碼實(shí)現(xiàn))案例設(shè)計(jì)1268【案例2】-案例描述

信息的存儲是為了方便對信息的重復(fù)使用。一般對信息的操作包含增加、刪除、修改和查詢這四項(xiàng),這四項(xiàng)操作都基于已存在的文件。本案例的目標(biāo)是實(shí)現(xiàn)學(xué)生信息的讀取,要求從案例1生成的文件中,讀取學(xué)生信息,輸出到屏幕上?!景咐?】-案例描述信息的存儲是為了方便對信息的69【案例2】-案例分析

本案例的實(shí)現(xiàn)基于案例1中已存在的文件,通過案例1的學(xué)習(xí)可知,在對文件進(jìn)行操作之前需要先打開文件,之后才能逐一讀取文件中的內(nèi)容。案例1中生成了兩個(gè)文件,一個(gè)為文本文件,一個(gè)為二進(jìn)制文件,因?yàn)槠浯娣判问讲煌?,所以在打開時(shí)需要使用不同的打開模式?!景咐?】-案例分析本案例的實(shí)現(xiàn)基于案例1中已70【案例2】-必備知識1讀文件文件位置指針2【案例2】-必備知識1讀文件文件位置指針271(1)、讀文本文件fgetc()函數(shù)用于讀取文件的字符,其語法格式如下:讀文件 charfgetc(FILE*fp);【案例2】-必備知識參數(shù)fp表示一個(gè)文件指針變量,char表示函數(shù)返回值的類型為字符類型。(1)、讀文本文件讀文件 charfgetc(FILE*72讀文件(1)、讀文本文件fgets()函數(shù)用于從文件中讀取一行字符串,或讀取指定長度的字符串,其函數(shù)聲明如下: char*fgets(char*buf,intmaxCount,FILE*file);【案例2】-必備知識參數(shù)buf指向用來存儲文件數(shù)據(jù)的數(shù)組的地址;參數(shù)maxCount指明存儲數(shù)據(jù)的大??;參數(shù)file是將要讀取的文件的文件指針。返回值類型char*型表示函數(shù)返回值的類型是字符型指針。讀文件(1)、讀文本文件 char*fgets(char73讀文件(2)、讀二進(jìn)制文件fread()函數(shù)用于在程序中以二進(jìn)制的形式來讀取文件,其函數(shù)聲明如下:

unsignedintfread(void*dstBuf,unsignedintelementSize,

unsignedintcount,FILE*file);【案例2】-必備知識參數(shù)dstBuf表示指向要接收數(shù)據(jù)的內(nèi)存空間的指針;參數(shù)elementSize表示接收的數(shù)據(jù)項(xiàng)的字節(jié)數(shù);參數(shù)count表示每次函數(shù)運(yùn)行時(shí)要讀取的數(shù)據(jù)項(xiàng)的個(gè)數(shù),每個(gè)數(shù)據(jù)項(xiàng)是elementSize個(gè)字節(jié);參數(shù)file表示文件指針,該指針指向需要寫入字符的文件;返回值類型unsignedint型表示函數(shù)返回值的類型為無符號整型。讀文件(2)、讀二進(jìn)制文件 unsignedintfre74(2)、讀二進(jìn)制文件fscanf()函數(shù)用于從文件中格式化讀取數(shù)據(jù),其函數(shù)聲明如下:

intfscanf(FILE*file,constchar*format,...);讀文件【案例2】-必備知識參數(shù)file表示文件指針,該指針指向需要讀取字符串的文件;參數(shù)format表示文件中的字符串以什么樣的格式輸入到程序中;返回值類型int型表示函數(shù)返回值的類型為整型。(2)、讀二進(jìn)制文件 intfscanf(FILE*f751、rewind()函數(shù)rewind()函數(shù)的作用是將文件位置指針指向文件開頭,該函數(shù)的定義的語法格式如下所示:文件位置指針

voidrewind(FILE*fp);【案例2】-必備知識1、rewind()函數(shù)文件位置指針 voidrewind762、fseek()函數(shù)fseek()函數(shù)的作用是將文件位置指針指向指定位置,該函數(shù)定義的語法格式如下所示:文件位置指針

intfseek(FILE*fp,longoffset,intorigin);【案例2】-必備知識參數(shù)origin的值有三個(gè),具體如下:●SEEK_SET:對應(yīng)的數(shù)字值為0,表示從文件開頭進(jìn)行偏移;●SEEK_CUR:對應(yīng)的數(shù)字值為1,相對于當(dāng)前位置進(jìn)行偏移;●SEEK_END:對應(yīng)的數(shù)字值為2,相對于文件末尾進(jìn)行偏移。2、fseek()函數(shù)文件位置指針 intfseek(FI773、ftell()函數(shù)ftell()函數(shù)的作用是獲取文件位置指針的當(dāng)前位置,該函數(shù)定義的語法格式如下所示:文件位置指針

longftell(FILE*fp);【案例2】-必備知識ftell()函數(shù)調(diào)用成功后,返回文件位置指針的當(dāng)前位置,但如果當(dāng)文件不存在或發(fā)生其他錯(cuò)誤時(shí),則函數(shù)的返回值為-1L。3、ftell()函數(shù)文件位置指針 longftell(F78【案例2】-案例實(shí)現(xiàn)案例代碼(詳見教材代碼實(shí)現(xiàn))案例設(shè)計(jì)

讀取文件之前應(yīng)保證文件已經(jīng)存在,本案例設(shè)計(jì)讀取案例1中生成的文件。文件讀取時(shí)同樣需要打開和關(guān)閉,本案例中將使用不同的打開模式打開文本文件和二進(jìn)制文件,之后分別使用fgetc()和fscanf()函數(shù)獲取文本文件中的內(nèi)容,使用fread()函數(shù)讀取二進(jìn)制文件中的內(nèi)容?!景咐?】-案例實(shí)現(xiàn)案例代碼(詳見教材代碼實(shí)現(xiàn))案例設(shè)計(jì)79【案例3】-案例描述

編程實(shí)現(xiàn)學(xué)生成績的存儲和刪除,具體要求如下:

(1)根據(jù)輸入的路徑和文件名創(chuàng)建或打開文件,通過輸入設(shè)備輸入多條學(xué)生信息,將輸入的學(xué)生信息保存到磁盤文件中;

(2)根據(jù)用戶輸入的學(xué)生姓名,刪除成績表中對應(yīng)的記錄。【案例3】-案例描述編程實(shí)現(xiàn)學(xué)生成績的存儲和刪除,80【案例3】-案例分析

存儲一條信息的方法在案例1中已經(jīng)實(shí)現(xiàn),本案例中需要實(shí)現(xiàn)的是存儲多條信息到文件中,與案例1的不同在于在打開和關(guān)閉文件之間將會進(jìn)行多次寫操作。

刪除信息的基本方法是:將文件中的數(shù)據(jù)讀到輔助變量中,檢測輔助變量中是否包含要?jiǎng)h除的信息,如果有,則刪除此條信息,然后以重寫的方式打開文件,使用輔助變量中的數(shù)據(jù)覆蓋原文件中的數(shù)據(jù)。

經(jīng)過以上分析可知,刪除學(xué)生信息的主要步驟依然是文件信息的讀寫。文件信息的讀寫方式在案例1和案例2中已經(jīng)學(xué)習(xí),本案例不再贅述。【案例3】-案例分析存儲一條信息的方法在案例181【案例3】-案例實(shí)現(xiàn)案例設(shè)計(jì)信息的寫入和存儲123構(gòu)造學(xué)生結(jié)構(gòu)體,結(jié)構(gòu)體中包含學(xué)生姓名和成績;使用追加方式打開一個(gè)二進(jìn)制文件,將結(jié)構(gòu)體數(shù)組中的數(shù)據(jù)逐條寫入文件中;定義一個(gè)學(xué)生結(jié)構(gòu)體變量數(shù)組,保存寫入的每一條學(xué)生信息;【案例3】-案例實(shí)現(xiàn)案例設(shè)計(jì)123構(gòu)造學(xué)生結(jié)構(gòu)體,結(jié)構(gòu)體中包82【案例3】-案例實(shí)現(xiàn)案例設(shè)計(jì)信息的寫入和存儲123由用戶輸入一個(gè)學(xué)生姓名;45以重寫的方式打開文件,將數(shù)組中的信息寫入文件,之后關(guān)閉文件。檢測數(shù)組中是否包含要?jiǎng)h

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論