第11章文件及其應用_第1頁
第11章文件及其應用_第2頁
第11章文件及其應用_第3頁
第11章文件及其應用_第4頁
第11章文件及其應用_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第11章文件及其應用鹽城第11章文件及其應用11.1文件的引入11.2文件的打開與關閉11.3文件的順序讀寫11.4文件的隨機讀寫11.5文件應用舉例11.1文件的引入前面所學的程序中用到的輸入和輸出都只涉及到鍵盤和顯示器。在運行C程序時,通過鍵盤輸入數據,并借助顯示器把程序的運算結果顯示出來,并不能保存相關數據。但是,計算機作為一種先進的數據處理工具,它所面對的數據信息量十分龐大,僅依賴于鍵盤輸入和顯示輸出等方式是遠遠不夠的?!疽繉σ粋€班級學生成績進行處理,包括學生信息的多次輸入與修改、處理、輸出等。問題分析:

本例要求多次對學生的信息輸入,如果每次都是從鍵盤輸入這些成批的數據,一方面數據輸入的工作量大,另一方面很容易產生差錯。因此,要解決這一類問題,就必須采用數據文件的方法來處理。11.1.1問題與引例11.1文件的引入1.文件的概念“文件”—是指一組相關數據的有序集合。這個數據集有一個名稱,叫做文件名。當有大量數據輸入時,通過編輯工具可以事先建立輸入數據文件,程序運行時從指定的文件中讀取數據,從而實現數據“一次輸入,多次使用”的效果。同樣,當有大量數據輸出時,也可將其輸出到指定文件,供隨時查看。11.1.2文件的基本概念2.文件的類型在程序設計中,主要用到兩種類型的文件:程序文件和數據文件。程序文件:包括源程序文件(后綴為.c)、目標文件(后綴為.obj)、可執(zhí)行文件(后綴為.exe)等。這種文件的內容是程序代碼。數據文件:文件的內容不是程序,而是供程序運行時讀寫的數據,如在程序運行過程中輸出到磁盤(或其他外部設備)的數據,或在程序運行過程中供讀入的數據。如一批學生的成績數據,或貨物交易的數據等。11.1.2文件的基本概念2.文件的類型C語言程序把文件分為ASCII文件和二進制文件。ASCII文件又稱文本文件,每一個字節(jié)存放一個字符的ASCII碼,便于對字符進行逐個處理,但一般占用存儲空間較多;二進制文件中的數據在內存中是以二進制形式存儲的,占用存儲空間較少。11.1.2文件的基本概念2.文件的類型字符一律以ASCII形式存儲數值型數據既可以用ASCII形式存儲,也可以用二進制形式存儲如有整數10000,如果用ASCII碼形式輸出到磁盤,則在磁盤中占5個字節(jié)(每一個字符占一個字節(jié)),而用二進制形式輸出,則在磁盤上只占4個字節(jié)(用VC++時)11.1.2文件的基本概念0011100100111000001110000011100000111000(1)(0)(0)(0)(0)ASCII形式00000000000000000011011100011000二進制形式(10000)數據的存儲:以10000為例來說明11.1.2文件的基本概念3.文件的讀寫輸入輸出是數據傳送的過程,數據如流水一樣從一處流向另一處,因此常將輸入輸出形象地稱為流(stream),即數據流。流表示了信息從源到目的端的流動。在程序中,當調用輸入函數從文件中輸入數據賦給程序中的變量時,這種操作稱為“輸入”或“讀”;當調用輸出函數把程序中的變量的值輸出到文件中時,這種操作稱為“輸出”或“寫”。11.1.2文件的基本概念4.文件的存取方式文件輸入輸出方式也稱“存取方式”。C語言中,文件有兩種存取方式:順序存取和直接存?。ㄒ步须S機存?。m樞虼嫒∥募奶攸c是:每當“打開”文件進行讀或寫操作時,總是從文件的開頭開始,從頭到尾順序地讀/寫;直接(隨機)存取文件的特點是:可以通過C語言的庫函數去指定開始讀/寫的字節(jié)號,然后直接對此位置上的數據進行讀/寫操作。11.1.2文件的基本概念在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針,通過文件指針就可對它所指的文件進行各種操作。定義文件指針的一般形式:FILE*指針變量名;

如:FILE*fp;

表示fp是指向FILE結構的指針變量,通過fp即可找到存放某個文件信息的結構變量,然后按結構變量提供的信息找到該文件,實施對該文件的操作。11.1.3文件指針聲明FILE結構體類型的信息包含在頭文件“stdio.h”中一般設置一個指向FILE類型變量的指針變量,然后通過它來引用這些FILE類型變量11.1.3文件指針FILE

*fp1,*fp2,*fp3;文件f1的文件信息區(qū)fp1文件f2的文件信息區(qū)fp2文件f3的文件信息區(qū)fp311.1.3文件指針11.2.1文件的打開對文件讀寫之前應該“打開”該文件,在使用結束之后應“關閉”該文件。所謂打開文件,實際上是建立文件的各種有關信息,并使文件指針指向該文件,以便進行其它操作。關閉文件則斷開指針與文件之間的聯系,也就是禁止再對該文件進行操作。11.2文件的打開與關閉

C語言中文件操作都是由庫函數來完成的。下面介紹主要的文件操作函數。1.文件的打開在編寫程序時,在打開文件的同時,一般都指定一個指針變量指向該文件,也就是建立起指針變量與文件之間的聯系,這樣就可以通過該指針變量對文件進行讀寫FILE*fp;11.2.1文件的打開1.文件的打開文件的打開使用fopen函數,其調用的一般形式:

文件指針名=fopen(文件名,使用文件方式);其中:“文件指針名”必須是被說明為FILE類型的指針變量;“文件名”是被打開文件的數據文件名,是字符串常量或字符串數組;“使用文件方式”是指文件的類型和操作要求。11.2.1文件的打開1.文件的打開通常將fopen函數的返回值賦給一個指向文件的指針變量。如:FILE*fp;fp=fopen(”a1”,”r”);其意義是在當前文件夾下打開文件a1,只允許進行“讀”操作,并使fp指向該文件11.2.1文件的打開1.文件的打開在打開一個文件時,通知C編譯系統以下3個信息:①需要訪問的文件的名字②使用文件的方式(“讀”還是“寫”等)③讓哪一個指針變量指向被打開的文件使用文件方式參見下表11.2.1文件的打開文件使用方式

意義"r"只讀打開一個文本文件,只允許讀數據"w"只寫打開或建立一個文本文件,只允許寫數據"a"追加打開一個文本文件,并在文件末尾寫數據"rb"只讀打開一個二進制文件,只允許讀數據"wb"只寫打開或建立一個二進制文件,只允許寫數據"ab"追加打開一個二進制文件,并在文件末尾寫數據"r+"讀寫打開一個文本文件,允許讀和寫"w+"讀寫打開或建立一個文本文件,允許讀寫"a+"讀寫打開一個文本文件,允許讀,或在文件末追加數據"rb+"讀寫打開一個二進制文件,允許讀和寫"wb+"讀寫打開或建立一個二進制文件,允許讀和寫"ab+"讀寫打開一個二進制文件,允許讀,或在文件末追加數據2.文件使用方式的說明(1)文件使用方式由r,w,a,b,+五個字符拼成,含義:r(read):讀w(write):寫a(append):追加b(inary):二進制文件+:讀和寫(2)凡用“r”方式打開一個文件時,該文件必須已經存在,且只能從該文件讀出。11.2.1文件的打開2.文件使用方式的說明(3)用"w"打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經存在,則將該文件刪去,重建一個新文件。(4)若要向一個已存在的文件追加新的信息,只能用"a"方式打開文件。但此時該文件必須是存在的,否則將會出錯。(5)在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。11.2.1文件的打開文件使用后,應及時將文件關閉,以避免文件的數據丟失等錯誤。關閉文件用fclose函數。fclose函數調用的一般形式為:fclose(文件指針);

例如:fclose(fp);正常完成關閉文件操作時,fclose函數返回值為0。如果返回非零值,則表示有錯誤發(fā)生11.2.2文件的關閉11.3文件的順序讀寫對文件的讀和寫是最常用的文件操作。文件的順序讀(或寫)操作總是從文件的開頭開始,從頭到尾順序地讀(或寫)。在C語言中提供了多種用于文件讀寫的函數:字符讀寫函數(fgetc和fputc)、字符串讀寫函數(fgets和fputs)、數據塊讀寫函數(fread和fwrite)、格式化讀寫函數(fscanf和fprinf)。注意:使用以上函數都要求包含頭文件stdio.h。函數名調用形式功能返回值fgetcch=fgetc(fp)從fp指向的文件讀入一個字符讀成功,帶回所讀的字符,失敗則返回文件結束標志EOF(即-1)fputcfputc(ch,fp)把字符ch寫到文件指針變量fp所指向的文件中寫成功,返回值就是輸出的字符;輸出失敗,則返回EOF(即-1)讀寫字符函數——fgetc(),fputc()11.3.1字符讀寫字符讀寫函數是以字符(字節(jié))為單位的讀寫函數。每次可從文件讀出或向文件寫入一個字符。包含fgetc(),fputc()兩個函數。1.讀字符函數fgetcfgetc函數的功能是從指定的文件中讀一個字符。

函數調用的形式為:字符變量=fgetc(文件指針);例如:ch=fgetc(fp);//從打開的文件fp中讀取一個字符并送入ch中。11.3.1字符讀寫幾點說明:(1)在fgetc函數調用中,讀取的文件必須是以讀或讀寫方式打開的。(2)讀取字符的結果也可以不向字符變量賦值。例如:fgetc(fp);但是讀出的字符不能保存。(3)在文件內部有一個位置指針,用來指向文件的當前讀寫字節(jié),在文件打開時,該指針總是指向文件的第一個字節(jié)。(4)feof()函數可以檢查文件讀寫位置標記是否已經到文件尾,如果到文件尾,函數返回值為1,否則為011.3.1字符讀寫【例11.1】讀入文件c1.txt,在屏幕上輸出。#include<stdio.h>voidmain(){FILE*fp;charch;if((fp=fopen("d:\\ccxsj\\example\\c1.txt","r"))==NULL){printf("\nCannotopenanykeyexit!");getch();exit(1);}ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp);}2.寫字符函數fputcfputc函數的功能是把一個字符寫入指定的文件中,函數調用的形式為:fputc(字符,文件指針);其中,待寫入的字符量可以是字符常量或變量,例如:fputc('a',fp);其意義是把字符'a'寫入fp所指向的文件中。11.3.1字符讀寫幾點說明:(1)被寫入的文件可以用寫、讀寫、追加方式打開,用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內容,寫入字符從文件首開始。如需保留原有文件內容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。文件若不存在,創(chuàng)建該文件。(2)每寫入一個字符,文件內部位置指針向后移動一個字節(jié)。(3)fputc函數有一個返回值,如果寫入成功則返回寫入的字符,否則返回一個EOF。11.3.1字符讀寫【例11.2】從鍵盤輸入一行字符,寫入一個文件,再把該文件內容讀出顯示在屏幕上。#include<stdio.h>voidmain(){FILE*fp;charch;if((fp=fopen("d:\\ccxsj\\example\\string","w+"))==NULL){printf(“不能打開,按任意鍵退出!");getch();exit(1);}printf("inputastring:\n");ch=getchar();while(ch!='\n'){fputc(ch,fp);ch=getchar();}rewind(fp);ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}printf("\n");

fclose(fp);}

【例11.3】

將一個磁盤文件中的信息復制到另一個磁盤文件中。要求將已經建立的文件中的內容復制到另一個磁盤文件中。解題思路:處理此問題的算法是:從文件中逐個讀入字符,然后逐個輸出到中。#include<stdio.h>#include<stdlib.h>voidmain(){FILE*in,*out;charch,in],out];printf("輸入讀入文件的名字:");scanf("%s",infile);printf("輸入輸出文件的名字:");scanf("%s",outfile);if((in=fopen(infile,"r"))==NULL){printf("無法打開此文件\n");exit(0);}if((out=fopen(outfile,"w"))==NULL){printf("無法打開此文件\n");exit(0);}改為rb和wb,則復制一個二進制文件改為rb和wb,則復制一個二進制文件while(!feof(in)){ch=fgetc(in);

fputc(ch,out);putchar(ch);}putchar(11);fclose(in);fclose(out);}檢查當前讀寫位置是否移到文件末尾讀寫字符串函數--fgets(),fputs()函數名調用形式功能返回值fgetsfgets(str,n,fp)從fp指向的文件讀入長度為(n-1)的字符串,存放到字符數組str中讀成功,返回地址str,失敗則返回NULL)fputsfputs(str,fp)str所指向的字符串寫到文件指針變量fp所指向的文件中寫成功,返回0;否則返回非0值11.3.2字符串讀寫1.讀字符串函數fgets函數的功能是從指定的文件中讀一個字符串到字符數組中,函數調用的形式為:fgets(字符數組名,n,文件指針);其中:n是一個正整數,表示從文件中讀出的字符串不超過n-1個字符。在讀入的最后一個字符后加上串結束標志'\0'。例如:fgets(str,n,fp);其意義是從fp所指的文件中讀出n-1個字符送入字符數組str中。11.3.2字符串讀寫#include<stdio.h>voidmain(){FILE*fp;charstr[11];if((fp=fopen("d:\string.txt","r"))==NULL){……//若文件不存在,輸出提示信息,返回}

fgets(str,11,fp);

//從文件fp中讀10個字符printf("\n%s\n",str);fclose(fp);}【例11.4】從文件中讀入一個含10個字符的字符串。2.寫字符串函數fputsfputs函數的功能是向指定的文件寫入一個字符串,其調用形式:

fputs(字符串,文件指針);其中:字符串可以是字符串常量,也可以是字符數組名,或指針變量。

例如:fputs("abcd",fp);其意義是把字符串"abcd"寫入fp所指的文件之中。11.3.2字符串讀寫分析下列部分代碼的功能:scanf("%s",st);fputs(st,fp);rewind(fp);ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}//從鍵盤讀取一個字符串給st//將字符串st里的內容寫到文件中//將文件內部位置指針移動文件首部//從文件中一次讀取一個字符//從文件中一次讀取一個字符//若不在文件尾【例11.5】在例11.2中建立的文件string中追加一個字符串。#include<stdio.h>voidmain(){FILE*fp;charch,st[20];if((fp=fopen("string","a+"))==NULL){printf("Cannotopenanykeyexit!");getch();exit(1);}printf("inputastring:\n");scanf("%s",st);fputs(st,fp);rewind(fp);ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}printf("\n");fclose(fp);}數據塊讀寫函數—fread(),fwrite()

數據塊讀寫函數可用來讀寫一組數據,如一個數組元素,一個結構變量的值等。

讀數據塊函數調用的一般形式為:fread(buffer,size,count,fp);

寫數據塊函數調用的一般形式為:fwrite(buffer,size,count,fp);其中:buffer是一個指針,在fread函數中,它表示存放輸入數據的首地址。在fwrite函數中,它表示存放輸出數據的首地址;size表示數據塊的字節(jié)數;count表示要讀寫的數據塊塊數;fp表示文件指針。11.3.3數據塊讀寫例如:fread(fa,4,5,fp);其意義是從fp所指的文件中,每次讀4個字節(jié)(一個實數)送入實型數組fa中,連續(xù)讀5次,即讀5個實數到fa中。

11.3.3數據塊讀寫【例11.6】從鍵盤輸入兩個學生的數據,并寫入一個文件中,再讀出這兩個學生的數據顯示在屏幕上。程序分析:定義一個結構體類型student,并聲明兩個結構數組boya和boyb以及兩個結構指針變量pp和qq。pp指向boya,qq指向boyb。以讀寫方式打開二進制文件“stu_list”,輸入2個學生的數據之后,寫入該文件中,然后把文件內部位置指針移到文件首,讀出兩塊學生數據后,在屏幕上顯示。11.3.3數據塊讀寫#include<stdio.h>structstudent{charname[10];intnum;intage;charaddr[15];}boya[2],boyb[2],*pp,*qq;11.3.3數據塊讀寫voidmain(){FILE*fp;

charch;inti;pp=boya;

qq=boyb;if((fp=fopen("d:\st1","wb+"))==NULL){printf("Cannotopenanykeyexit!");getch();exit(1);}printf("\ninputdata\n");for(i=0;i<2;i++,pp++)scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);pp=boya;fwrite(pp,sizeof(structstu),2,fp);rewind(fp);fread(qq,sizeof(structstu),2,fp);printf("\n\nname\tnumberageaddr\n");for(i=0;i<2;i++,qq++)printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);fclose(fp);}11.3.3數據塊讀寫fscanf()函數、fprintf()函數與前面使用的scanf()和printf()函數的功能相似,都是格式化讀寫函數。

兩者的區(qū)別在于fscanf()函數和fprintf()函數的讀寫對象不是鍵盤和顯示器,而是磁盤文件。

11.3.4格式化讀寫一般調用方式為:fprintf(文件指針,格式字符串,輸出表列);

fscanf(文件指針,格式字符串,輸入表列);如:fprintf(fp,”%d,%6.2f”,i,f);fscanf(fp,”%d,%f”,&i,&f);

11.3.4格式化讀寫pp=boya;for(i=0;i<2;i++,pp++)fprintf(fp,"%s%d%d%s\n",pp->name,pp->num,pp->age,pp->addr);rewind(fp);for(i=0;i<2;i++,qq++)fscanf(fp,"%s%d%d%s\n",qq->name,&qq->num,&qq->age,qq->addr);11.3.4格式化讀寫11.4文件的隨機讀寫對文件進行順序讀寫比較容易理解,也容易操作,但有時效率不高隨機訪問不是按數據在文件中的物理位置次序進行讀寫,而是可以對任何位置上的數據進行訪問,顯然這種方法比順序訪問效率高得多11.4.1位置指針復位

實現隨機讀寫的關鍵是要按要求移動位置指針,這稱為文件的定位。

移動文件內部位置指針的函數主要有兩個,即rewind函數和fseek函數。

其調用形式為:rewind(文件指針);它的功能是把文

溫馨提示

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

評論

0/150

提交評論