版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第9章保存程序數(shù)據(jù)案例:將“學生信息管理系統(tǒng)”的學生信息進行永久保存使用文件保存學生信息案例實施學生練習拓展小結(jié)1編輯課件案例:保存學生信息在本章,將繼續(xù)完善“學生信息管理系統(tǒng)”案例程序。本章可以實現(xiàn)對學生完整信息的長期保存,能將學生的基本信息保存在磁盤上。當需要的時候可以從磁盤上讀出數(shù)據(jù),當數(shù)據(jù)被修改的時候,能重新寫回磁盤,保證磁盤上的數(shù)據(jù)和內(nèi)存數(shù)據(jù)一致。具體包括:(1)將學生的完整信息保存在磁盤的指定位置;(2)在程序運行的時候可以加載指定文件中的學生信息;2編輯課件使用文件保存學生信息-文件概念它一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的。根據(jù)文件的組織形式,C語言將文件分為文本文件和二進制文件兩種。3編輯課件按文本文件存放數(shù)據(jù)時,每個字符占一個字節(jié),并且按其ASCII碼存儲到文件中,所以文本文件也稱為ASCII文件。它的每個字節(jié)放一個ASCII代碼,代表一個字符。4編輯課件按二進制文件存放數(shù)據(jù),其存放形式與數(shù)據(jù)在內(nèi)存中的存儲形式相同,也就是說數(shù)據(jù)是按其在內(nèi)存中的存儲形式原樣輸出到磁盤上存放。所以不需要轉(zhuǎn)換,從而可以提高效率而且也能節(jié)省存儲空間。5編輯課件在C語言中,對文件的讀寫都是通過庫函數(shù)實現(xiàn)的。6編輯課件使用文件保存學生信息-文件操作文件的處理必須包括:打開文件讀或?qū)懳募?、關閉文件磁盤文件內(nèi)存儲器數(shù)據(jù)存儲區(qū)………………磁盤文件內(nèi)存儲器………………數(shù)據(jù)存儲區(qū)磁盤文件內(nèi)存儲器數(shù)據(jù)存儲區(qū)………………磁盤文件內(nèi)存儲器數(shù)據(jù)存儲區(qū)………………7編輯課件使用文件保存學生信息-打開文件標準輸入輸出函數(shù),用fopen()函數(shù)來實現(xiàn)打開文件。fopen函數(shù)的調(diào)用方式通常是:
FILE*fs;fs=fopen("文件名","打開模式");8編輯課件其中fs是一個文件指針,文件指針是FILE類型,F(xiàn)ILE類型已由系統(tǒng)聲明,可直接使用。通過文件指針,可以對它所指向的文件進行各種操作。9編輯課件fopen是一個系統(tǒng)函數(shù),有兩個參數(shù),其中文件名包括文件所在的全部路徑,路徑的分隔符'\'應采用轉(zhuǎn)義字符的形式。文件可以是文本文件,也可以是二進制文件。10編輯課件打開模式是指定所要打開的文件讀寫方式,打開模式要用小寫,并且要用雙引號括起來11編輯課件使用文件保存學生信息-打開文件Mode(方式)意義"r"(只讀)打開一個文本文件,只允許讀數(shù)據(jù)"w"(只寫)創(chuàng)建一個文本文件,只允許寫數(shù)據(jù)"a"(追加)打開一個文本文件,并在文件的末尾增加數(shù)據(jù)"rb"(只讀)打開一個二進制文件,只允許讀數(shù)據(jù)"wb"(只寫)創(chuàng)建一個二進制文件,只允許寫數(shù)據(jù)"ab"(追加)打開一個二進制文件,并在文件的末尾增加數(shù)據(jù)"r+"(讀寫)打開一個文本文件,允許讀和寫"w+"(讀寫)建立一個文本文件,允許讀和寫"a+"(讀寫)打開一個文本文件,允許讀或在文件末尾追加數(shù)據(jù)"rb+"(讀寫)打開一個二進制文件,允許讀和寫"wb+"(讀寫)建立一個二進制文件,允許讀和寫"ab+"(讀寫)打開一個二進制文件,允許讀或在文件末尾追加數(shù)據(jù)12使用文件保存學生信息-打開文件如果不能實現(xiàn)“打開”文件的任務,fopen函數(shù)將會帶回一個出錯信息,出錯的原因可能是用“r”方式打開一個并不存在的文件;磁盤出故障;磁盤已經(jīng)滿了,無法建立一個新文件等。此時fopen函數(shù)將帶回一個空指針值NULL。13編輯課件常常用下面的方法打開一個文件:
if((fs=fopen("file1","r"))==NULL){printf("cannotopenthisfile\n");exit(0);}14編輯課件使用文件保存學生信息-讀寫文件fread函數(shù)和fwrite函數(shù),一般調(diào)用形式為:fread(buffer,size,count,fs);fwrite(buffer,size,count,fs);15編輯課件其中:buffer是一個指針,對fread來說,它是讀入數(shù)據(jù)的存放地址,對fwrite來說,它是要輸出數(shù)據(jù)的地址,都是指起始地址。size要讀寫的字節(jié)數(shù)。count要進行讀寫多少個size字節(jié)的數(shù)據(jù)項。fs文件類型的指針。16編輯課件使用文件保存學生信息-讀寫文件Student*stu;stu=(Student*)malloc(total*sizeof(Student));假設學生的數(shù)據(jù)已經(jīng)存放在磁盤文件中,并且存放了current個學生的信息,這時可以用下面的for語句和fread函數(shù)讀入current個學生的數(shù)據(jù):for(i=0;i<current;i++)fread((stu+i),sizeof(Student),1,fs);17編輯課件可以用fwrite函數(shù)把內(nèi)存中的學生數(shù)據(jù)輸出到磁盤文件中去:for(i=0;i<current;i++)fwrite((stu+i),sizeof(Student),1,fs);18編輯課件使用文件保存學生信息-讀寫文件fseek函數(shù)可以實現(xiàn)改變文件的位置指針。調(diào)用形式為:
fseek(文件指針,位移量,起始點)其中起始點用0、1和2代替,0代表“文件的開始”,1代表“當前位置”,2代表“文件的末尾”位移量是指以“起始點”為基點,向前移動的字節(jié)數(shù)(該位移量可以為正數(shù),也可以是負數(shù))。19編輯課件ANSIC要求位移量是long型數(shù)據(jù),這樣當文件的長度大于64K時不會出問題。ANSIC標準規(guī)定在數(shù)字的末尾加一個字母L,表示是long型。同時fseek函數(shù)一般用于二進制文件,因為文本文件要發(fā)生字符轉(zhuǎn)換,計算位置時往往發(fā)生混亂??梢杂茫簊ucc=fseek(fs,0,SEEK_END);使得fseek函數(shù)返回文件的末尾。20編輯課件使用文件保存學生信息-讀寫文件ftell()函數(shù)的作用是得到文件中的當前位置,用相對于文件開頭的位移量來表示。由于文件中的位置指針經(jīng)常移動,人們往往不容易知道當前的位置。用ftell函數(shù)可以得到當前的位置,如果ftell函數(shù)返回值為-1L,表示出錯。如:i=ftell(fs);if(i==-1L)printf("error\n");21編輯課件使用文件保存學生信息-關閉文件在使用完一個文件后應該關閉它,以防止它再被誤用?!瓣P閉文件”就是使文件指針變量不指向該文件,也就是文件指針變量與文件“脫鉤”,此后不能再通過該指針對原來與其相聯(lián)系的文件進行讀寫操作。除非再次打開,使該指針變量重新指向該文件。22編輯課件用fclose函數(shù)關閉文件。fclose函數(shù)的調(diào)用形式為:
fclose(文件指針);fclose函數(shù)也帶回一個值,當順利地執(zhí)行了關閉操作,則返回值為0,否則返回為EOF(-1)。23編輯課件前面曾經(jīng)把打開文件(用fopen函數(shù))時所帶回的指針賦給了fs,今通過fs把該文件關閉,使其不再指向該文件。在編寫程序的時候,應該養(yǎng)成在程序終止之前關閉所有文件的習慣,如果不關閉文件將可能造成數(shù)據(jù)的丟失。24編輯課件案例實施-使用文件保存學生信息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編輯課件案例實施-使用文件保存學生信息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編輯課件學生練習到現(xiàn)在為止,已經(jīng)完成對學生信息進行永久保存了,即將學生的完整信息以指定的文件名保存到磁盤上指定的位置。同時也可以將磁盤上文件中的學生信息讀入?,F(xiàn)在到了你們完成圖書信息管理系統(tǒng)中的數(shù)據(jù)保存和加載的時候了。繼續(xù)完善你的案例程序,使之可以將圖書信息在磁盤上進行長期保存,同時又可以將磁盤上文件的信息讀入。具體要求:(1)編寫能保存圖書信息的案例程序;(2)編寫能加載圖書信息的案例程序;(3)在CodeBlocks環(huán)境下調(diào)試你的程序,使之正確運行。30編輯課件拓展-open函數(shù)基本模式含義修飾符含義O_RDONLY
只讀O_APPEND文件指針指向末尾O_WRONLY只寫O_CREAT文件不存在時創(chuàng)建文件,屬性按基本模式屬性O_RDWR讀寫O_TRUNC若文件存在,將其長度縮為0,屬性不變
O_BINARY打開一個二進制文件
O_TEXT打開一個文字文件open()函數(shù)的作用是打開文件,其調(diào)用格式為:intopen(constchar*path,intaccess[,unsignedmode]);參數(shù)path是要打開的文件名,access是打開的模式,mode是修飾符,可選項。表示文件的屬性,修飾符可以有多個,但基本模式只能有一個。31編輯課件文件open()函數(shù)打開成功,返回值就是文件描述字的值(非負值),否則返回-1。比如在案例程序“學生信息管理系統(tǒng)”中要在磁盤上保存學生信息。如果以StudentData.dat文件名保存在當前路徑下,并且是以二進制文件保存。則基本模式為O_WRONLY。其打開文件代碼為:fhandle=open("StudentData.dat",O_WRONLY|O_CREAT|O_TRUNC);如果現(xiàn)在想讀取上面存儲的學生信息,這個時候首先是以只讀方式打開數(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ù)返回實際寫入的字節(jié)。如上面打開了文件,同時open函數(shù)的返回值賦給了整形變量fhandle。學生數(shù)據(jù)保存在結(jié)構(gòu)體數(shù)組stu中,學生數(shù)目為current個,則把學生信息寫入打開的數(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ù)返回實際讀出的字節(jié)。同樣可以把剛剛保存的學生信息從新加載。則代碼為:read(fhandle,stu,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 音樂數(shù)字資源開發(fā)與應用-洞察分析
- 體育用品制造業(yè)供應鏈優(yōu)化-洞察分析
- 煙草種植市場供需預測-洞察分析
- 息肉切除術遠期預后-洞察分析
- 2024年滬科版必修1地理下冊階段測試試卷
- 《知識型企業(yè)經(jīng)營》課件
- 旅游行業(yè)綠色能源資源管理辦法
- 高鐵軌道制造保溫板安裝協(xié)議
- 廠房水電施工合同:機場建設篇
- 2025年滬教新版選擇性必修2物理下冊月考試卷
- 2024-2025學年北師版八年級物理上冊期末考試綜合測試卷
- 2023-2024學年廣東省廣州市白云區(qū)八年級(上)期末數(shù)學試卷及答案解析
- 幼兒園課件-神奇的中草藥
- 起重機零配件(易損件)清單
- 錐坡工程量計算
- 植物園設計規(guī)范
- 深圳市建設工程施工圍擋圖集(試行版_下半部分).pdf
- 熱水器3c安全試驗報告及第三方檢測報告dsf65mx ts tx ws wx ys yx ms
- 南洋電工GSB1A型16錠高速編織機使用說明書
- 大管輪見習記錄簿范本匯總
- 園區(qū)保安隊長的工作職責
評論
0/150
提交評論