C程序設(shè)計(jì)第9章保存程序數(shù)據(jù)課件_第1頁
C程序設(shè)計(jì)第9章保存程序數(shù)據(jù)課件_第2頁
C程序設(shè)計(jì)第9章保存程序數(shù)據(jù)課件_第3頁
C程序設(shè)計(jì)第9章保存程序數(shù)據(jù)課件_第4頁
C程序設(shè)計(jì)第9章保存程序數(shù)據(jù)課件_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章保存程序數(shù)據(jù)案例:將“學(xué)生信息管理系統(tǒng)”的學(xué)生信息進(jìn)行永久保存使用文件保存學(xué)生信息案例實(shí)施學(xué)生練習(xí)拓展小結(jié)1編輯課件案例:保存學(xué)生信息在本章,將繼續(xù)完善“學(xué)生信息管理系統(tǒng)”案例程序。本章可以實(shí)現(xiàn)對(duì)學(xué)生完整信息的長(zhǎng)期保存,能將學(xué)生的基本信息保存在磁盤上。當(dāng)需要的時(shí)候可以從磁盤上讀出數(shù)據(jù),當(dāng)數(shù)據(jù)被修改的時(shí)候,能重新寫回磁盤,保證磁盤上的數(shù)據(jù)和內(nèi)存數(shù)據(jù)一致。具體包括:(1)將學(xué)生的完整信息保存在磁盤的指定位置;(2)在程序運(yùn)行的時(shí)候可以加載指定文件中的學(xué)生信息;2編輯課件使用文件保存學(xué)生信息-文件概念它一般指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合。操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的。根據(jù)文件的組織形式,C語言將文件分為文本文件和二進(jìn)制文件兩種。3編輯課件按文本文件存放數(shù)據(jù)時(shí),每個(gè)字符占一個(gè)字節(jié),并且按其ASCII碼存儲(chǔ)到文件中,所以文本文件也稱為ASCII文件。它的每個(gè)字節(jié)放一個(gè)ASCII代碼,代表一個(gè)字符。4編輯課件按二進(jìn)制文件存放數(shù)據(jù),其存放形式與數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式相同,也就是說數(shù)據(jù)是按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤上存放。所以不需要轉(zhuǎn)換,從而可以提高效率而且也能節(jié)省存儲(chǔ)空間。5編輯課件在C語言中,對(duì)文件的讀寫都是通過庫函數(shù)實(shí)現(xiàn)的。6編輯課件使用文件保存學(xué)生信息-文件操作文件的處理必須包括:打開文件讀或?qū)懳募?、關(guān)閉文件磁盤文件內(nèi)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)區(qū)………………磁盤文件內(nèi)存儲(chǔ)器………………數(shù)據(jù)存儲(chǔ)區(qū)磁盤文件內(nèi)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)區(qū)………………磁盤文件內(nèi)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)區(qū)………………7編輯課件使用文件保存學(xué)生信息-打開文件標(biāo)準(zhǔn)輸入輸出函數(shù),用fopen()函數(shù)來實(shí)現(xiàn)打開文件。fopen函數(shù)的調(diào)用方式通常是:

FILE*fs;fs=fopen("文件名","打開模式");8編輯課件其中fs是一個(gè)文件指針,文件指針是FILE類型,F(xiàn)ILE類型已由系統(tǒng)聲明,可直接使用。通過文件指針,可以對(duì)它所指向的文件進(jìn)行各種操作。9編輯課件fopen是一個(gè)系統(tǒng)函數(shù),有兩個(gè)參數(shù),其中文件名包括文件所在的全部路徑,路徑的分隔符'\'應(yīng)采用轉(zhuǎn)義字符的形式。文件可以是文本文件,也可以是二進(jìn)制文件。10編輯課件打開模式是指定所要打開的文件讀寫方式,打開模式要用小寫,并且要用雙引號(hào)括起來11編輯課件使用文件保存學(xué)生信息-打開文件Mode(方式)意義"r"(只讀)打開一個(gè)文本文件,只允許讀數(shù)據(jù)"w"(只寫)創(chuàng)建一個(gè)文本文件,只允許寫數(shù)據(jù)"a"(追加)打開一個(gè)文本文件,并在文件的末尾增加數(shù)據(jù)"rb"(只讀)打開一個(gè)二進(jìn)制文件,只允許讀數(shù)據(jù)"wb"(只寫)創(chuàng)建一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)"ab"(追加)打開一個(gè)二進(jìn)制文件,并在文件的末尾增加數(shù)據(jù)"r+"(讀寫)打開一個(gè)文本文件,允許讀和寫"w+"(讀寫)建立一個(gè)文本文件,允許讀和寫"a+"(讀寫)打開一個(gè)文本文件,允許讀或在文件末尾追加數(shù)據(jù)"rb+"(讀寫)打開一個(gè)二進(jìn)制文件,允許讀和寫"wb+"(讀寫)建立一個(gè)二進(jìn)制文件,允許讀和寫"ab+"(讀寫)打開一個(gè)二進(jìn)制文件,允許讀或在文件末尾追加數(shù)據(jù)12使用文件保存學(xué)生信息-打開文件如果不能實(shí)現(xiàn)“打開”文件的任務(wù),fopen函數(shù)將會(huì)帶回一個(gè)出錯(cuò)信息,出錯(cuò)的原因可能是用“r”方式打開一個(gè)并不存在的文件;磁盤出故障;磁盤已經(jīng)滿了,無法建立一個(gè)新文件等。此時(shí)fopen函數(shù)將帶回一個(gè)空指針值NULL。13編輯課件常常用下面的方法打開一個(gè)文件:

if((fs=fopen("file1","r"))==NULL){printf("cannotopenthisfile\n");exit(0);}14編輯課件使用文件保存學(xué)生信息-讀寫文件fread函數(shù)和fwrite函數(shù),一般調(diào)用形式為:fread(buffer,size,count,fs);fwrite(buffer,size,count,fs);15編輯課件其中:buffer是一個(gè)指針,對(duì)fread來說,它是讀入數(shù)據(jù)的存放地址,對(duì)fwrite來說,它是要輸出數(shù)據(jù)的地址,都是指起始地址。size要讀寫的字節(jié)數(shù)。count要進(jìn)行讀寫多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)。fs文件類型的指針。16編輯課件使用文件保存學(xué)生信息-讀寫文件Student*stu;stu=(Student*)malloc(total*sizeof(Student));假設(shè)學(xué)生的數(shù)據(jù)已經(jīng)存放在磁盤文件中,并且存放了current個(gè)學(xué)生的信息,這時(shí)可以用下面的for語句和fread函數(shù)讀入current個(gè)學(xué)生的數(shù)據(jù):for(i=0;i<current;i++)fread((stu+i),sizeof(Student),1,fs);17編輯課件可以用fwrite函數(shù)把內(nèi)存中的學(xué)生數(shù)據(jù)輸出到磁盤文件中去:for(i=0;i<current;i++)fwrite((stu+i),sizeof(Student),1,fs);18編輯課件使用文件保存學(xué)生信息-讀寫文件fseek函數(shù)可以實(shí)現(xiàn)改變文件的位置指針。調(diào)用形式為:

fseek(文件指針,位移量,起始點(diǎn))其中起始點(diǎn)用0、1和2代替,0代表“文件的開始”,1代表“當(dāng)前位置”,2代表“文件的末尾”位移量是指以“起始點(diǎn)”為基點(diǎn),向前移動(dòng)的字節(jié)數(shù)(該位移量可以為正數(shù),也可以是負(fù)數(shù))。19編輯課件ANSIC要求位移量是long型數(shù)據(jù),這樣當(dāng)文件的長(zhǎng)度大于64K時(shí)不會(huì)出問題。ANSIC標(biāo)準(zhǔn)規(guī)定在數(shù)字的末尾加一個(gè)字母L,表示是long型。同時(shí)fseek函數(shù)一般用于二進(jìn)制文件,因?yàn)槲谋疚募l(fā)生字符轉(zhuǎn)換,計(jì)算位置時(shí)往往發(fā)生混亂??梢杂茫簊ucc=fseek(fs,0,SEEK_END);使得fseek函數(shù)返回文件的末尾。20編輯課件使用文件保存學(xué)生信息-讀寫文件ftell()函數(shù)的作用是得到文件中的當(dāng)前位置,用相對(duì)于文件開頭的位移量來表示。由于文件中的位置指針經(jīng)常移動(dòng),人們往往不容易知道當(dāng)前的位置。用ftell函數(shù)可以得到當(dāng)前的位置,如果ftell函數(shù)返回值為-1L,表示出錯(cuò)。如:i=ftell(fs);if(i==-1L)printf("error\n");21編輯課件使用文件保存學(xué)生信息-關(guān)閉文件在使用完一個(gè)文件后應(yīng)該關(guān)閉它,以防止它再被誤用?!瓣P(guān)閉文件”就是使文件指針變量不指向該文件,也就是文件指針變量與文件“脫鉤”,此后不能再通過該指針對(duì)原來與其相聯(lián)系的文件進(jìn)行讀寫操作。除非再次打開,使該指針變量重新指向該文件。22編輯課件用fclose函數(shù)關(guān)閉文件。fclose函數(shù)的調(diào)用形式為:

fclose(文件指針);fclose函數(shù)也帶回一個(gè)值,當(dāng)順利地執(zhí)行了關(guān)閉操作,則返回值為0,否則返回為EOF(-1)。23編輯課件前面曾經(jīng)把打開文件(用fopen函數(shù))時(shí)所帶回的指針賦給了fs,今通過fs把該文件關(guān)閉,使其不再指向該文件。在編寫程序的時(shí)候,應(yīng)該養(yǎng)成在程序終止之前關(guān)閉所有文件的習(xí)慣,如果不關(guān)閉文件將可能造成數(shù)據(jù)的丟失。24編輯課件案例實(shí)施-使用文件保存學(xué)生信息intsave(){ intcount; FILE*fs; fs=fopen("StudentData.dat","wb"); if(fs==NULL) { printf("不能打開文件\n"); return1; } 25編輯課件count=fwrite(stu,sizeof(Student),current,fs); fclose(fs); if(count!=current) { printf("保存失敗\n"); return1; } printf("保存成功\n"); return0;}26編輯課件案例實(shí)施-使用文件保存學(xué)生信息intload(){ FILE*fs; intcount; intsucc; fs=fopen("StudentData.dat","rb"); if(fs==NULL) { printf("不能打開文件\n"); return1; } succ=fseek(fs,0,SEEK_END);27編輯課件 if(succ!=0) { printf("文件操作失敗\n"); fclose(fs); return1; } count=ftell(fs); fseek(fs,0,SEEK_SET); current=count/sizeof(Student); count=fread(stu,sizeof(Student),current,fs); fclose(fs);28編輯課件 if(count!=current) { printf("讀文件失敗\n"); return1; } printf("讀文件成功\n"); return0;}29編輯課件學(xué)生練習(xí)到現(xiàn)在為止,已經(jīng)完成對(duì)學(xué)生信息進(jìn)行永久保存了,即將學(xué)生的完整信息以指定的文件名保存到磁盤上指定的位置。同時(shí)也可以將磁盤上文件中的學(xué)生信息讀入?,F(xiàn)在到了你們完成圖書信息管理系統(tǒng)中的數(shù)據(jù)保存和加載的時(shí)候了。繼續(xù)完善你的案例程序,使之可以將圖書信息在磁盤上進(jìn)行長(zhǎng)期保存,同時(shí)又可以將磁盤上文件的信息讀入。具體要求:(1)編寫能保存圖書信息的案例程序;(2)編寫能加載圖書信息的案例程序;(3)在CodeBlocks環(huán)境下調(diào)試你的程序,使之正確運(yùn)行。30編輯課件拓展-open函數(shù)基本模式含義修飾符含義O_RDONLY

只讀O_APPEND文件指針指向末尾O_WRONLY只寫O_CREAT文件不存在時(shí)創(chuàng)建文件,屬性按基本模式屬性O(shè)_RDWR讀寫O_TRUNC若文件存在,將其長(zhǎng)度縮為0,屬性不變

O_BINARY打開一個(gè)二進(jìn)制文件

O_TEXT打開一個(gè)文字文件open()函數(shù)的作用是打開文件,其調(diào)用格式為:intopen(constchar*path,intaccess[,unsignedmode]);參數(shù)path是要打開的文件名,access是打開的模式,mode是修飾符,可選項(xiàng)。表示文件的屬性,修飾符可以有多個(gè),但基本模式只能有一個(gè)。31編輯課件文件open()函數(shù)打開成功,返回值就是文件描述字的值(非負(fù)值),否則返回-1。比如在案例程序“學(xué)生信息管理系統(tǒng)”中要在磁盤上保存學(xué)生信息。如果以StudentData.dat文件名保存在當(dāng)前路徑下,并且是以二進(jìn)制文件保存。則基本模式為O_WRONLY。其打開文件代碼為:fhandle=open("StudentData.dat",O_WRONLY|O_CREAT|O_TRUNC);如果現(xiàn)在想讀取上面存儲(chǔ)的學(xué)生信息,這個(gè)時(shí)候首先是以只讀方式打開數(shù)據(jù)庫文件。其代碼是:fhandle=open("StudentData.dat",O_RDONLY);32編輯課件拓展-write函數(shù)write函數(shù)寫一塊數(shù)據(jù)到文件中。其調(diào)用格式為:intwrite(inthandle,void*buf,unsignedlen);參數(shù)buf讀出的數(shù)據(jù),len是寫入的字節(jié),函數(shù)返回實(shí)際寫入的字節(jié)。如上面打開了文件,同時(shí)open函數(shù)的返回值賦給了整形變量fhandle。學(xué)生數(shù)據(jù)保存在結(jié)構(gòu)體數(shù)組stu中,學(xué)生數(shù)目為current個(gè),則把學(xué)生信息寫入打開的數(shù)據(jù)庫文件中的代碼為:write(fhandle,stu,sizeof(Student)*current);33編輯課件拓展-read函數(shù)read()從文件讀取一塊數(shù)據(jù)。其調(diào)用格式為:intread(inthandle,void*buf,unsignedlen);參數(shù)buf保存讀出的數(shù)據(jù),len是讀取的字節(jié)。函數(shù)返回實(shí)際讀出的字節(jié)。同樣可以把剛剛保存的學(xué)生信息從新加載。則代碼為:read(fhandle,stu,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論