版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2023/2/11第13章讀寫文件主要內容文件相關概念讀取文本文件
寫文本文件讀寫二進制文件隨機讀寫文件2023/2/12什么是文件?文件相關概念2023/2/13文件即是存儲在外部介質(例如硬盤)中的數(shù)據的集合。每一個文件都有文件名(主干),文件存儲位置以及文件的類型(擴展名)等信息。例如:G:\tzhg\temp.txt表示temp.txt這個文件存儲在G盤下tzhg這個文件夾中,它是一個txt文件,即是一個記事本文件。文件相關概念2023/2/14文件分為文本文件和二進制文件。文本文件中的數(shù)據都被當作字符來對待,二進制文件中的數(shù)據會被當作。例如有一個整數(shù):123如果將其當作文本文件來對待,則會被當作字符’1’,’2’,‘3’來處理,存儲時,會將這些字符對應的ASCII碼存儲到磁盤中,磁盤中存儲的信息為:如果將其當作二進制文件來處理,則會將整數(shù)123轉化為二進制數(shù)01111011存儲到磁盤中。簡單地說,數(shù)據在內存中是什么形式,在磁盤中就是什么形式。001100010011001000110011文件相關概念2023/2/15
為什么要讀寫文件?文件相關概念2023/2/16程序運行期間,可能需要從文件中獲取數(shù)據,這時需要對文件進行讀操作,簡稱讀文件
程序運行后的結果有時候需要永久保存起來,這時就需要將這些結果數(shù)據寫(保存)到文件中,簡稱寫文件。文件相關概念2023/2/17第13章讀寫文件文件相關概念
讀取文本文件
寫文本文件讀寫二進制文件隨機讀寫文件2023/2/18
按文本讀取文件的步驟(1)聲明FILE指針變量(FILE是stdio.h中聲明的結構體類型)FILE*fp;(2)打開文件
使用庫函數(shù)fopen打開文件,fopen函數(shù)的返回值為文件的地址,即文件中第一個字節(jié)的地址號,將其賦給指針變量fpfp=fopen(文件名字,打開方式);fopen函數(shù)的第一個參數(shù)是一個字符串,可以為文件的名字,或者為文件的絕對路徑,例如:第一個參數(shù)取值:“hello.txt”或者:“G:\\tzhg\\temp.txt”
當取值是文件名字時,要求該文件和當前C程序(可執(zhí)行文件)在同一目錄中101fp指向文件外部存儲器101文件讀取文本文件2023/2/19fopen函數(shù)的第二個參數(shù)也是一個字符串,用于決定打開文件的方式,即以文本方式還是以二進制方式打開文件。
如第二個參數(shù)的值為”r”,則表示以文本方式打開文件如第二個參數(shù)的值為”rb”,則表示以二進制方式打開文件(3)確定按文本讀取文件在步驟(2)中,讓fopen函數(shù)的第二個參數(shù)取值為如下之一:
“r”:以只讀方式打開文件,即按文本方式打開一個文件,程序將按文本方式讀取該文件,如果文件不存在,fopen返回NULL。
“r+”:打開方式為讀/寫方式。例如:fp=fopen(“G:\\tzhg\\temp.txt”,“r”)使用fgetc()函數(shù)或fgets()函數(shù)讀取文件charfgetc(FILE*fp);該函數(shù)從文件中讀取一個字符,函數(shù)的參數(shù)fp表示與某一個文件相關聯(lián)的指針,fgetc函數(shù)即從參數(shù)fp所關聯(lián)的那個文件讀取數(shù)據。每調用一次fgetc函數(shù),就從相關聯(lián)的文件按順序讀取一個字符,該函數(shù)的返回值表示讀取到的這個字符。例如,假設某個文本文件中的內容為abc,那么第一次調用fgetc函數(shù)讀出的字符為’a’,第二次調用fgetc函數(shù)讀出的字符為’b’,第三次調用fgetc函數(shù)讀出的字符為’c’。由于文件只有三個字符,第三次調用fgetc函數(shù)時就讀到了文件的最后一個字符,如果再調用fgetc函數(shù)進行第四次讀取,fgetc函數(shù)的返回值將是EOF(EOF是在stdio.h中定義的符號常量,值為-1,是endoffile的首字母縮寫,表示文件的末尾)。程序可以通過fgetc函數(shù)的返回值是否等于EOF來判斷是否已經讀完了文件中的所有內容。讀取文本文件2023/2/110char*fgets(charstr[],intn,FILE*p)fegts函數(shù)從參數(shù)p所指向的文件一次讀取n-1個字符,并將讀取到的這n-1個字符存放到第一個參數(shù)所指定的字符數(shù)組str中,并在字符數(shù)組str的末尾添加一個空字符’\0’。每調用一次fegts函數(shù)就從p所指向的文件中讀取n-1個字符,直到讀到文件的末尾。最后一次讀取到的字符可能不足n-1個。如果沒有讀到文件的末尾,fgets的返回值是字符數(shù)組str的首地址,如果讀到文件的末尾,fgets的返回值是NULL,程序可以通過返回值是否為NULL來判斷文件是否讀完。(5)關閉文件
調用函數(shù)fclose關閉第二步打開的文件:fclose(fp);讀取文本文件2023/2/111讀取文本文件的步驟可以進一步簡化為以下三步:1)FILE*fp=fopen(要打開的文件,打開方式);2)使用fgetc函數(shù)或者fgets函數(shù)讀取文件中的數(shù)據
3)讀取完畢后用庫函數(shù)fclose關閉文件讀取文本文件2023/2/112【例12-1】使用fgetc函數(shù)讀取文件中的內容(chp12_1.c)#include<stdio.h>intmain(){//第一步,打開文件,并讓文件指針fp指向打開的文件FILE*fp=fopen("E:\\file\\hello.txt","r");//第二步,使用fgetc函數(shù)從文件中讀取數(shù)據charch;if(fp!=NULL){ch=fgetc(fp);while(ch!=EOF){printf("%c",ch);ch=fgetc(fp);}//第三步,關閉文件fclose(fp);}return0;}讀取文本文件2023/2/113【例12-2】使用fgets函數(shù)讀取文件中的內容(chp12_2.c)#include<stdio.h>intmain(){//第一步,打開文件,并讓文件指針fp指向打開的文件FILE*fp=fopen("E:\\file\\hello.txt","r");//第二步,使用fgets函數(shù)從文件中讀取數(shù)據charstr[6];char*result;if(fp!=NULL){result=fgets(str,6,fp);while(result!=NULL){printf("%s",str);result=fgets(str,6,fp);}}//第三步,關閉文件fclose(fp);return0;}讀取文本文件2023/2/114第13章讀寫文件文件相關概念讀取文本文件
寫文本文件讀寫二進制文件隨機讀寫文件2023/2/115程序中的數(shù)據一般都存儲在內存中,當程序運行結束或者關閉計算機,內存中的數(shù)據將丟失。當需要將程序中的數(shù)據永久地保存起來時,就需要將這些數(shù)據寫入到磁盤文件中。程序中的數(shù)據可以被當作兩種類型來對待,即文本類型和二進制類型。例如,對于0來說,可以把它當作數(shù)字0來對待,也可以把它當作字符“0”來對待。如果將其當作字符“0”來對待,寫入到文件中的數(shù)據是字符“0”的ASCII值48,即二進制數(shù)00110000。寫文本文件2023/2/116寫文本文件步驟:第一步:以寫入的方式打開文件。即:FILE*fp=fopen(要打開的文件,打開方式);打開方式的取值有以下幾種:“w”:以寫入的方式打開一個文本文件,如文件不存在,則建立該文件。如文件已經存在,當向該文件寫入新的數(shù)據時,該文件原來的數(shù)據將被清除掉?!癮”:在文本文件的末尾添加數(shù)據(a表示append),如文件不存在,則建立新文件。如文件已經存在,當向該文件寫入新的數(shù)據時,新的數(shù)據會附加在文件原來數(shù)據的末尾?!皉+”:以讀取和寫入的方式打開文件,可以從文件讀取數(shù)據,也可以往文件寫入數(shù)據,但這種方式要求打開的文件已經存在?!皐+”:以寫入和讀取的方式打開文件,可以從文件讀取數(shù)據,也可以往文件寫入數(shù)據。這種方式會新建一個文件(不管原來文件存在不存在)。所以,以這種方式打開文件時,應該先寫入數(shù)據到文件中,然后再從文件中讀取數(shù)據?!癮+”:可以從文件讀取數(shù)據,也可以往文件寫入數(shù)據。寫入數(shù)據時,新寫入的數(shù)據會附加在原來數(shù)據的末尾。寫文本文件2023/2/117第二步,使用庫函數(shù)fputc或fputs將數(shù)據寫入到文件中。fputc函數(shù)的原型如下:intfputc(intch,FILE*fp);該函數(shù)將ch這個字符寫入到fp所關聯(lián)的那個文件中去,寫入時,會將ch添加到文件的末尾。如果寫入成功,fputc函數(shù)的返回值就是寫入的字符ch。如果不成功,返回值就是EOF(即-1)。fputs函數(shù)的原型:charfputs(charstr[],FILE*fp);fputs函數(shù)將字符數(shù)組str中的內容寫入到fp所指向的文件中去。寫入時,會將str數(shù)組中的內容添加在文件原來數(shù)據的末尾。如果寫入成功,函數(shù)返回寫入字符數(shù)組str的首字符;如果寫入失敗,返回EOF。第三步,數(shù)據寫入完畢后,使用庫函數(shù)fclsoe關閉文件。寫文本文件2023/2/118【例12-3】使用fputc函數(shù)將數(shù)據寫入文件中(chp12_3.c)#include<stdio.h>#include<string.h>intmain(){//第一步,打開文件,并讓文件指針fp指向打開的文件FILE*fp=fopen("E:\\file\\test.txt","w");//第二步,使用fputc函數(shù)將數(shù)據寫入到文件中。charstrs[3][20]={{"abc"},{"123"},{"ABC"}};inti;if(fp!=NULL){for(i=0;i<3;i++){intj;for(j=0;j<strlen(strs[i]);j++){fputc(strs[i][j],fp);//往fp指向的文件寫入字符strs[i][j]}}//第三步,關閉文件fclose(fp);}return0;}寫文本文件2023/2/119【例12-4】使用fputs函數(shù)將數(shù)據寫入文件中(chp12_4.c)#include<stdio.h>#include<string.h>intmain(){//第一步,打開文件,并讓文件指針fp指向打開的文件FILE*fp=fopen("E:\\file\\test2.txt","w");//第二步,使用fputs函數(shù)將數(shù)據寫入到文件中。charstrs[3][20]={{"abc"},{"123"},{"ABC"}};inti;if(fp!=NULL){for(i=0;i<3;i++){fputs(strs[i],fp);//將字符數(shù)組strs[i]寫入到文件指針fp所關聯(lián)的文件中。}//第三步,關閉文件fclose(fp);}return0;}寫文本文件2023/2/120第13章讀寫文件文件相關概念讀取文本文件
寫文本文件
讀寫二進制文件隨機讀寫文件2023/2/121程序中的數(shù)據可以當作文本型數(shù)據來對待,也可以當作二進制數(shù)據來對待。例如,對于68,如果將其當作文本數(shù)據來對待,則表示字符’6’和字符’8’,可以將其寫入到文本文件中以便永久保存。寫入到文本文件的內容是字符’6’的ASCII值54(對應的二進制數(shù)為00110110)和字符’8’的ASCII值56(對應的二進制數(shù)為00111000),各占一個字節(jié),一共兩字節(jié);如果將其當作二進制數(shù)據來對待,則其表示的二進制數(shù)為01000100,可以將其寫入到二進制文件中,寫入的值為01000100,占一個字節(jié)。讀寫二進制文件的步驟與讀寫文本文件的步驟類似讀寫二進制文件2023/2/122讀寫步驟第一步:使用庫函數(shù)fopen以二進制的方式打開文件,例如FILE*fp=fopen(要打開的文件,打開方式);打開方式的取值有以下幾種:“rb”:以二進制只讀方式打開文件,程序將讀取到的數(shù)據當作二進制數(shù)據進行處理,如果該文件不存在,fopen函數(shù)返回NULL?!皐b”:以二進制只寫的方式打開文件,程序將數(shù)據以二進制的方式寫入文件。如果該文件已經存在,則寫入數(shù)據時,文件原來的內容先被清除,然后再寫入。如果文件不存在,則建立一個新文件,然后再寫入數(shù)據。“ab”:以二進制尾加的方式打開文件。寫入數(shù)據時,新寫入的數(shù)據添加在原來文件內容的后面。如果該文件不存在,fopen函數(shù)返回NULL。“rb+”:以二進制讀寫的方式打開文件。如果該文件不存在,fopen函數(shù)返回NULL?!皐b+”:以二進制讀寫的方式打開文件。如果該文件存在,寫入時,該文件原來的內容將先被清除掉,然后再寫入。如果該文件不存在,則新建一個文件。這種方式只允許先往文件寫入數(shù)據,然后再讀取?!癮b+”:以二進制讀寫的方式打開文件。如果該文件不存在,fopen函數(shù)返回NULL。寫入數(shù)據時,新寫入的數(shù)據存放在文件原來數(shù)據的后面。這種方式也允許從文件讀取數(shù)據。寫文本文件2023/2/123第二步:使用庫函數(shù)從二進制文件中讀寫數(shù)據(使用fread函數(shù)從二進制文件中讀取數(shù)據,使用fwrite函數(shù)往二進制文件中寫入數(shù)據)。fwrite函數(shù)的原型:intfwrite(void*buf,intsize,intcount,FILE*fp);該函數(shù)接收4個參數(shù),參數(shù)的意義如下:fp:將數(shù)據寫入fp所指向的文件。buf:存放寫入的數(shù)據,以buf作為起始地址的內存中的一段數(shù)據將寫入到文件中。size:寫入到文件中的一個數(shù)據所占的字節(jié)數(shù)。count:寫入到文件中的數(shù)據的個數(shù)。fwrite函數(shù)返回成功寫入的數(shù)據的個數(shù)(成功寫入的數(shù)據個數(shù)可能小于count)。fread函數(shù)的原型:intfread(void*buf,intsize,intcount,FILE*fp);該函數(shù)接收4個參數(shù),參數(shù)的意義如下:fp:從fp所指向的文件中讀取數(shù)據。buf:存放讀取到的數(shù)據,以buf作為起始地址的內存區(qū)域將存放從文件中讀取到的數(shù)據。size:讀取的每個數(shù)據所占的字節(jié)數(shù)count:讀取數(shù)據的個數(shù)。fread函數(shù)返回成功讀取到的數(shù)據的個數(shù)(成功讀取的數(shù)據個數(shù)可能小于count)。第三步,讀取或寫入完畢后,關閉文件。讀寫二進制文件2023/2/124【例12-5】使用fwrite函數(shù)將數(shù)據寫入到二進制文件中(chp12_5.c)#include<stdio.h>intmain(){inta=10;intarray[3]={66,77,88};intsize=sizeof(int);//第一步,打開文件,并讓文件指針fp指向打開的文件FILE*fp=fopen("E:\\file\\data.dat","wb");//第二步,使用fwrite函數(shù)將數(shù)據寫入到文件中。if(fp!=NULL){fwrite(&a,size,1,fp);//將以變量a的地址開始的內存區(qū)域的的一個數(shù)據寫到fp所指//向的文件中,每個數(shù)據占size個字節(jié)fwrite(array,size,3,fp);//將以數(shù)組array開始的內存區(qū)域的三個數(shù)據寫到fp所指向的//文件中,每個數(shù)據占size個字節(jié)//第三步,關閉文件。fclose(fp);}return0;}讀寫二進制文件2023/2/125【例12-6】使用fread函數(shù)從二進制文件中讀取數(shù)據(chp12_6.c)#include<stdio.h>intmain(){inta;intarray[3];intsize=sizeof(int);inti;//第一步,打開文件,并讓文件指針fp指向打開的文件FILE*fp=fopen("E:\\file\\data.dat","rb");if(fp!=NULL){//第二步,使用fread函數(shù)將文件中的數(shù)據讀到內存中fread(&a,size,1,fp);fread(array,size,3,fp);printf("a=%d\n",a);for(i=0;i<3;i++){printf("array[%d]=%d\t",i,array[i]);}//第三步,關閉文件fclose(fp);}return0;}讀寫二進制文件2023/2/126【例12-7】使用fread函數(shù)和fwrite函數(shù)讀寫二進制數(shù)據(chp12_7.c)#include<stdio.h>typedefstruct{charname[20];intage;}Student;intmain(){Studentstus[3]={{"zhangsan",18},{"lisi",19},{"wangwu",20}};Studentstu;intsize=sizeof(Student);inti;FILE*fp=fopen("E:\\file\\student.dat","wb");if(fp!=NULL){intcount=fwrite(stus,size,3,fp);if(count==3){printf("成功寫入3個數(shù)據!\n");}fclose(fp);}fp=fopen("E:\\file\\student.dat","rb");if(fp!=NULL){for(i=0;i<3;i++){intcount=fread(&stu,size,1,fp);if(count==1){printf("name:%s\tage:%d\n",,stu.age);}}fclose(fp);}return0;}讀寫二進制文件2023/2/127第13章讀寫文件文件相關概念讀取文本文件
寫文本文件讀寫二進制文件
隨機讀寫文件2023/2/12813.4隨機讀寫前面學習的文件讀寫函數(shù)fgetc,fgets,fputc,fputs,fwrite,fread都有一個共同的特點,那就是對文件進行順序讀寫。順序讀的意思是,必須從文件的開始處讀數(shù)據,例如,要讀取文本文件的第三個字符數(shù)據,必須先將前面兩個字符讀出來,才能讀到第三個字符。順序寫的意思是,必須往文件的開始處或結尾處寫入數(shù)據(以”a”作為打開方式),而不能往文件中的某個特定位置上寫入新的數(shù)據。這種順序讀寫文件的方式有時候會非常的不方便,而且效率比較低。而這小節(jié)學習的隨機讀寫函數(shù)將可以做到這些,從而提高文件讀寫的效率。之前學習fgetc函數(shù)的時候,我們知道,第一次調用fgetc函數(shù)讀到的是文件的第一個字符,第二次調用fgetc函數(shù)讀到的是文件的第二個字符…,為什么第二次調用fgetc函數(shù)讀到的是文件的第二個字符,而不是第一個字符呢?系統(tǒng)是如何判斷的呢?這就涉及到一個文件讀寫標記的概念,每一個文件都有一個文件讀寫標記。一般情況下,當打開文件的時候,文件讀寫標記指向文件開頭,當?shù)谝淮问褂胒getc函數(shù)從文件讀數(shù)據時,就將文件讀寫標記所指向的位置上的那個字符讀取出來,接著文件讀寫標記向后移動一個位置,這時第二次調用fgetc函數(shù)讀到的就是文件的第二個字符,依次類推,直到文件末尾。對于往文件中寫入數(shù)據也是一樣的道理。2023/2/129為了方便對文件進行操作,可以使用庫函數(shù)改變文件讀寫標記的位置,從而達到對文件進行隨機讀寫的目的。rewind函數(shù)voidrewind(FILE*p)rewind函數(shù)能使讀寫標記回到文件的開頭處ftell函數(shù)longftell(FILE*p)ftell函數(shù)可以返回一個long型數(shù)值,該值是從文件開頭到當前讀寫標記的全部字節(jié)個數(shù),當ftell函數(shù)的返回值等于文件的長度時,表示讀寫位置處于文件的末尾。2023/2/1303.fseek函數(shù)intfseek(FILE*fp,longoffset,intorigin)fseek函數(shù)能隨機移動讀寫位置,參數(shù)意義如下:
origin:表示移動的起始點,取值范圍為:0、1、2。取值為0表示文件開始位置,取值為1表示當前位置,取值為2表示文件結尾位置。為了方便記憶,C標準在stdio.h中給這些值定義了符號常量:#defineSEEK_SET0#defineSEEK_CUR1#defineSEEK_END2offset:表示移動的位移量,以origin所指定的位置作為移動起始點。例如:fseek(fp,6,SEEK_SET);的意思是,將移動起始點定位在文件的開始處,然后將文件讀寫位置移動到距離文件開頭6個字節(jié)處。再如:fseek(fp,-8,SEEK_END);的意思是,將移動起始點定位在文件的結尾處,然后將文件讀寫位置往前(往文件開始的方向)移動8個字節(jié)。2023/2/131【例12-8】使用fseek函數(shù)對文件進行隨機讀寫#include<stdio.h>intmain(){FILE*fp=fopen("a.txt","w+");charstr[10]="abc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 喪葬服務合同范本
- 演藝服務合同實戰(zhàn)技巧解析
- 臨時保安聘用合同
- 正規(guī)個人借款合同模板
- 終止合同協(xié)議書全文版
- 借款合同模板關聯(lián)企業(yè)間的借貸協(xié)議
- 物業(yè)服務合同范本標準
- 家庭服務員雇傭協(xié)議
- 錄播教室設備采購合同
- 農家有機肥銷售合同
- 北京市東城區(qū)2022-2023學年八年級上學期期末統(tǒng)一檢測 數(shù)學試卷 (解析版)
- 智能手機使用培訓課件
- 2023年中國煙草總公司河北省公司考試真題及答案
- 基于STM32的雙模式智能避障小車系統(tǒng)設計與實現(xiàn)
- 生態(tài)環(huán)境第三方服務項目應急預案
- 空中熱氣球模板
- 2024山東廣播電視臺招聘18人歷年高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 古風店鋪創(chuàng)業(yè)計劃書
- 國家電網招聘考試電工類真題及答案近年合集
- 鐵路工務系統(tǒng)養(yǎng)路工崗位標準樣本
- 體育教練員培訓方案
評論
0/150
提交評論