課件參考-1第7章文件處理_第1頁
課件參考-1第7章文件處理_第2頁
課件參考-1第7章文件處理_第3頁
課件參考-1第7章文件處理_第4頁
課件參考-1第7章文件處理_第5頁
免費預覽已結束,剩余33頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第七章文件處理文件的引出為什么使用文件存儲數據?前面的程序里,我們學習了數組類型,能夠存儲一批數據。這些數據只有在程序運行過程中才存儲在數組中的,當程序運行結束后,系統就釋放數組的存儲空間,數據將不能保存下來。如果下次操作仍然針對同樣的一批數據,我們就不得不重新從鍵盤上輸入這批數據或重新初始化數組了。還有一個問題,程序的運行結果都是輸出到屏幕上的,程序運行結束后,結果并沒有保存下來,如果希望每次都將程序輸出到屏幕上的數據存儲下來,應該怎么辦呢?這樣就需要用到文件了。我們可以用磁盤文件把程序的已知數據存儲起來,需要的時候讓程序從文件里直接讀取數據,而不需每次從鍵盤輸入了。也可以將程序的運行結果寫入文件中存起來。文件的分類文本文件和二進制文件文本文件中按字符存儲內容,每一個字節存放一個ASCII碼,代表一個字符。也叫ASCII碼文件。二進制文件則是將數據按內存中的原樣(二進制形式)存放在磁盤上。文件的分類舉例例如:存儲12345這個整數,如果用文本文本文件存儲,將存儲12345,共5個數字字符,共占5個字節。如果用二進制形式存儲,將存儲12345在內存中的二進制形式00000000000000001101010000110001,共占4個字節。不論是二進制文件,還是文本文件,他們的文件操作都遵循同樣的操作步驟,只不過打開文件的使用方式不同而已。打開文件:fopen()讀寫文件:fscanf()或fprintf()關閉文件:fclose()FILE-構造的文件類型緩沖文件系統中,系統為每個正在被使用的文件都在內存中開辟一個區域,存放有關該文件的信息(如文件名、文件狀態、當前位置等)。C語言將這些信息保存在一個結構體變量中,該結構體類型是由系統在stdio.h中定義好的,取名為FILE。只需定義一個FILE類型的指針變量,通過該指針變量調用有關文件操作函數對指定文件進行操作。打開文件函數fopen對文件進行讀寫之前應當“打開”該文件,讀寫完畢之后應當“關閉”該文件。ANSIC規定使用fopen函數來打開文件。

FILE*fopen(char*filename,char*mode);其中,filename指定要打開的文件名,可以使用字符串常量,也可以使用指向字符串的指針變量;mode表示文件的使用方式。如fp=fopen("letter.dat","w");文件的使用方式

讀方式

r寫方式w追加方式a說明1.使用“r”

時,文件應已經存在。2.使用“w”時,新建一個文件,若磁盤上已有同名文件,則被清除。3.使用“a”時,文件應已經存在,原有內容不被刪除,位置指針移到數據末尾,可以添加內容。如果操作的是二進制文件,在打開方式中加上字母“b”。如果文件不在當前目錄下,應該給出完整文件名描述,即包括文件存放的路徑,如:fp=fopen(“d:\rose\letter.dat","w");注意賦值給定義的文件類型指針fp

文件關閉函數fclose()文件使用完畢后,要釋放文件緩沖區中的內容,將數據真正寫入到磁盤文件中保存起來,因此必須使用fclose()函數關閉文件。如果使用文件完畢沒有正常的關閉該文件,容易引起數據的丟失。格式:fclose(fp)文件使用總結和歸納:1、先定義文件類型指針2、使用fopen()函數打開或新建一個文件。3、檢測文件打開是否成功。4、向文件寫入數據,或從文件讀取數據。5、使用fclose()函數關閉文件。#include<stdio.h>main(){charch;FILE*fp;fp=fopen("letter.dat","w");if(fp==NULL){printf("\nOpeningfileerror");exit(0);}for(ch='A';ch<='Z';ch++)fputc(ch,fp);fputc('\n',fp);fclose(fp);}例1:將一串字符寫入文件保存起來。2文件讀寫函數我們使用文件的目的是為了存放數據,因此,對文件的操作主要可以分為兩種:讀操作和寫操作。讀操作是從文件中讀取數據;寫操作是往文件中寫數據,包括建立一個新文件、往文件中追加數據、插入數據或修改數據。

單字符寫入或讀取函數1.fputc函數2.fgetc函數例如:fputc(‘A’,fp);或fputc(ch,fp);ch=fgetc(fp)此處ch是字符變量

字符串寫入或讀取函數1.fputs函數2.fgets函數例如:fputs(“hello”,fp);或fputs(str,fp);fgets(str,長度,fp);此處str是字符數組名

塊數據,二進制數據寫入或讀取函數1.fwrite函數2.fread函數例如:fread(books,sizeof(structbook),N,fp);fwrite(books,sizeof(structbook),N,fp);此處books是數組名

格式化寫入或讀取函數1.fprintf函數2.fscanf函數例如:fprintf(fp,“%d:%.2f”,i,score);fscanf(fp,“%d%f”,&i,&score);檢測文件打開和其它文件使用函數如果打不開文件(原因很多),fopen會返回空指針NULL,我們常用下面的方法檢測文件是否打開:if(fp==NULL){printf(“無法打開此文件!\n”);exit(0);/*關閉所有文件,終止此程序。*/}

檢測文件是否結束函數feoffeof(fp);它用于檢測位置指針是否到達了文件尾部。返回非0表示位置指針已到達文件尾。返回0表示位置指針未到達文件尾。例如:while(!feof(fp)){...;fread(&student,sizeof(structstu),1,fp);}求文件指針當前位置函數ftellftell(fp);返回位置指針相對于文件開頭的位移量。若出錯返回-1L。

例如:n=ftell(fp);文件指針位置復位函數rewind

rewind(fp);將文件指針重撥回到文件開始處。

文件指針定位函數fseekintfseek(FILE*fp,longoffset,intbase);功能:將文件的位置指針移到以base為起始點,offset為位移量的位置,同時清除文件結束標志。base常用三個符號常量:SEEK_SET、SEEK_CUR和SEEK_END,分別為0、1、2常量值,分別表示文件開始、當前位置和文件末尾。offset表示以起始點為基準,向前或向后移動的字節數(正、負)。例如fseek(fp,2,SEEK_SET);表示將位置指針從文件開始處向后移動2個字節。fseek(fp,2,SEEK_CUR);表示將位置指針從當前位置向后移動2個字節。fseek(fp,-2,SEEK_END);表示將位置指針從文件尾部向前移動2個字節。無法編寫出永遠正確的程序。“程序中存在錯誤”,包括嚴重的硬件錯誤和一般的軟件錯誤,如硬盤損壞、試圖訪問越界的數據元素、試圖打開并不存在的文件、寫文件時磁盤沒有足夠的空間等。錯誤發生,程序的正常流程受到干擾而出現混亂,將引發異常情況,如程序異常終止、運行結果錯誤等。程序可能遇到的各種錯誤常常不期而至,卻又無法完全避免。一個好的程序應該能夠在錯誤出現后及時進行處理,導出錯誤信息,并根據情況終止或繼續程序。簡明、準確的錯誤信息將為處理錯誤提供有價值的幫助。需要指出,錯誤處理的目標并不是避免錯誤的發生,而是設法將損失降低到最小,不至造成嚴重的后果、甚至引起系統崩潰。引入錯誤處理代碼的程序,具有良好的健壯性。錯誤處理ferror()格式:intferror(FILE*fp)說明:如果訪問fp所指文件出現錯誤,則ferror()返回非0值。例如寫盤時,磁盤已裝滿數據,則出現寫錯誤。對同一文件,每次調用輸入輸出函數,都將產生一個新的ferror()函數值,因此在調用了輸入輸出函數后,應立即通過ferror()檢測錯誤。當使用fopen()打開一個文件時,系統將ferror()設置為0。clearerr()格式:voidclearer(FILE*fp)說明:clearerr()清除文件操作的錯誤標志和文件結尾指示標志。如果在調用輸入輸出函數時出現錯誤,ferror()為非0值,調用clearerr()后,ferror()將返回0值。【例】強制產生一輸入輸出錯誤,驗證ferror()和clearer()的作用。#include<stdio.h>main(void){ FILE*fp;

fp=fopen("dummy.c","w");/*以寫模式打開文件*/ (void)getc(fp);/*欲讀文件,將產生一個錯誤*/ if(ferror(fp)){ /*監測是否產生文件操作錯誤*/ printf("errorreadingfromdummy.c\n");/*顯示錯誤信息*/ clearerr(fp); } fclose(fp); return0;}運行程序,將顯示errorreadingfromdummy.c常用的文件函數列表例1:將一串字符寫入文件保存起來。標準輸入輸出函數main(intargc,char*argv[])getchar()和putchar()格式化輸出printf()

格式化輸入scanf()sprintf()與sscanf()7.9其他函數

【例7-23】malloc()的使用。#include<stdio.h>#include<string.h>#include<stdlib.h>main(void){ char*str; if((str=malloc(10))==NULL){/*申請存儲空間*/ printf("notenoughmemorytoallocatebuffer\n"); exit(1); /*內存不夠,結束程序*/ } strcpy(str,"hello"); /*拷貝"hello"到字符串str*/ printf("stringis%s\n",str); /*顯示str*/ free(str); /*釋放存儲空間*/ return0;}【例7-24】calloc()的使用。#include<stdio.h>#include<string.h>#include<stdlib.h>main(void){ char*str=NULL; str=calloc(10,sizeof(char));/*申請存儲空間*/ if(str){ strcpy(str,"hello");/*拷貝"hello"到字符串str*/ printf("stringis%s\n",st

溫馨提示

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

評論

0/150

提交評論