版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、示例:向文件data1.dat中寫入字符“Hello!”。#include #include void main()FILE *fp;char *s=Hello ! ;fp=fopen(“data1.dat, w);fputs(s,fp);fclose(fp);文件指針寫方式打開文件寫入文件示例:讀出文件data1.dat中的內(nèi)容#include #include void main()FILE *fp;char s20;fp=fopen(data1.dat, r);fgets(s,20,fp);printf(%sn,s);fclose(fp);文件指針讀方式打開文件讀出文件內(nèi)容10.1.1
2、什么是文件“文件”指存儲在外部介質(zhì)上數(shù)據(jù)的集合10.1.1 什么是文件文件有不同的類型,在程序設(shè)計(jì)中,主要用到兩種文件:程序文件。包括源程序文件(.c)、可執(zhí)行文件(后綴為.exe)等。這種文件的內(nèi)容是程序代碼。數(shù)據(jù)文件。文件的內(nèi)容不是程序,而是供程序運(yùn)行時(shí)讀寫的數(shù)據(jù),如在程序運(yùn)行過程中輸出到磁盤的數(shù)據(jù),或在程序運(yùn)行過程中供讀入的數(shù)據(jù)。10.1.2 文件名文件路徑表示文件在外部存儲設(shè)備中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面文件路徑文件名主干文件后綴10.1.2 文件名文件路徑表示文件在外部存儲設(shè)備中的位置。如:
3、 D: CCtempfile1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面文件名10.1.2 文件名文件路徑表示文件在外部存儲設(shè)備中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面命名規(guī)則遵循標(biāo)識符的命名規(guī)則10.1.2 文件名文件路徑表示文件在外部存儲設(shè)備中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面一般不超過3個字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)10.1.3 文件的分類
4、根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為ASCII文件和二進(jìn)制文件。ASCII文件又稱文本文件,每一個字節(jié)放一個字符的ASCII代碼10.1.4 文件緩沖區(qū)ANSI C標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理數(shù)據(jù)文件所謂緩沖文件系統(tǒng)是指系統(tǒng)自動地在內(nèi)存區(qū)為程序中每一個正在使用的文件開辟一個文件緩沖區(qū)10.1.4 文件緩沖區(qū)程序數(shù)據(jù)區(qū)輸出文件緩沖區(qū)輸入文件緩沖區(qū)磁盤從內(nèi)存向磁盤輸出數(shù)據(jù)裝滿緩沖區(qū)10.1.4 文件緩沖區(qū)程序數(shù)據(jù)區(qū)輸出文件緩沖區(qū)輸入文件緩沖區(qū)磁盤從磁盤向計(jì)算機(jī)讀入數(shù)據(jù)充滿緩沖區(qū)10.1.5 文件類型指針緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡稱“文件指針”文件信息是保存在一個結(jié)構(gòu)體變量中的。
5、該結(jié)構(gòu)體類型是由系統(tǒng)聲明的,取名為FILE。10.1.5 文件類型指針聲明FILE結(jié)構(gòu)體類型的信息包含在頭文件“stdio.h”中一般設(shè)置一個指向FILE類型變量的指針變量,然后通過它來引用這些FILE類型變量10.1.5 文件類型指針FILE*fp1,*fp2,*fp3;文件f1的文件信息區(qū)fp1文件f2的文件信息區(qū)fp2文件f3的文件信息區(qū)fp310.2 打開與關(guān)閉文件10.2.1 用fopen函數(shù)打開數(shù)據(jù)文件10.2.2 用fclose函數(shù)關(guān)閉數(shù)據(jù)文件10.2.1 用fopen函數(shù)打開數(shù)據(jù)文件對文件讀寫之前應(yīng)該“打開”該文件,在使用結(jié)束之后應(yīng)“關(guān)閉”該文件。所謂“打開”是指為文件建立相應(yīng)
6、的信息區(qū)(用來存放有關(guān)文件的信息)和文件緩沖區(qū)(用來暫時(shí)存放輸入輸出的數(shù)據(jù))。10.2.1 用fopen函數(shù)打開數(shù)據(jù)文件在編寫程序時(shí),在打開文件的同時(shí),一般都指定一個指針變量指向該文件,也就是建立起指針變量與文件之間的聯(lián)系,這樣就可以通過該指針變量對文件進(jìn)行讀寫所謂“關(guān)閉”是指撤銷文件信息區(qū)和文件緩沖區(qū) 10.2.1 用fopen函數(shù)打開數(shù)據(jù)文件fopen函數(shù)的調(diào)用方式為:FILE *fp;fp=fopen(“文件名”, ”使用文件方式”);例如: FILE *fp;fopen(“a1”,”r”); Fopen()的返回值是指向文件的指針fp.”r” 或”w” 10.2.1 用fopen函數(shù)打
7、開數(shù)據(jù)文件在打開一個文件時(shí),通知編譯系統(tǒng)以下3個信息:需要訪問的文件的名字使用文件的方式(“讀”還是“寫”等)讓哪一個指針變量指向被打開的文件使用文件方式參見教材表10.1。說明:(1) 用“r”方式打開的文件只能用于向計(jì)算機(jī)輸入而不能用作向該文件輸出數(shù)據(jù),而且該文件應(yīng)該已經(jīng)存在,并存有數(shù)據(jù),這樣程序才能從文件中讀數(shù)據(jù)。不能用“r”方式打開一個并不存在的文件,否則出錯。說明:(2) 用“w”方式打開的文件只能用于向該文件寫數(shù)據(jù)(即輸出文件),而不能用來向計(jì)算機(jī)輸入。如果原來不存在該文件,則在打開文件前新建立一個以指定的名字命名的文件。如果原來已存在一個以該文件名命名的文件,則在打開文件前先將該
8、文件刪去,然后重新建立一個新文件。說明:(3) 如果希望向文件末尾添加新的數(shù)據(jù)(不希望刪除原有數(shù)據(jù)),則應(yīng)該用“a”方式打開但此時(shí)應(yīng)保證該文件已存在;否則將得到出錯信息。打開文件時(shí),文件讀寫標(biāo)記移到文件末尾說明:(4) 用r+、w+、a+方式打開的文件既可以用來輸入數(shù)據(jù),也可以用來輸出數(shù)據(jù)。用r+方式時(shí)該文件應(yīng)該已經(jīng)存在。用w+方式則新建立一個文件,先向此文件寫數(shù)據(jù),然后可以讀此文件中的數(shù)據(jù)。用a+方式打開的文件,原來的文件不被刪去,文件讀寫位置標(biāo)記移到文件末尾,可以添加,也可以讀。說明:(5) 如果打開失敗,fopen函數(shù)將會帶回一個出錯信息。fopen函數(shù)將帶回一個空指針值NULL常用下面
9、的方法打開一個文件: if (fp=fopen(“file1”,r)=NULL)printf(“cannot open this filen”); exit(0);終止正在執(zhí)行的程序10.2.2 用fclose函數(shù)關(guān)閉數(shù)據(jù)文件關(guān)閉文件用fclose函數(shù)。fclose函數(shù)調(diào)用的一般形式為fclose(文件指針); 例如: fclose (fp); 如果不關(guān)閉文件將會丟失數(shù)據(jù)。10.3.1 怎樣向文件讀寫字符函數(shù)名調(diào)用形式功能返回值fgetcfgetc(fp)從fp指向的文件讀入一個字符讀成功,帶回所讀的字符,失敗則返回文件結(jié)束標(biāo)志(即-1)fputcfputc(ch,fp)把字符ch寫到文件指針
10、變量fp所指向的文件中寫成功,返回值就是輸出的字符;輸出失敗,則返回(即-1)讀寫一個字符的函數(shù) 例10.1 從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到用戶輸入一個“”為止。 解題思路:用fgetc函數(shù)從鍵盤逐個輸入字符,然后用fputc函數(shù)寫到磁盤文件即可。#include #include int main() FILE *fp; char ch,filename10; printf(請輸入所用的文件名:); scanf(%s,filename); if(fp=fopen(filename,“w”)=NULL) printf(無法打開此文件n); exit(0); ch=getcha
11、r( );接收最后輸入的回車符輸入文件名只寫用exit函數(shù)時(shí)加 printf(“請輸入一個字符串(以#結(jié)束):); ch=getchar( ); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp); putchar(10); return 0; 例10.2 將一個磁盤文件中的信息復(fù)制到另一個磁盤文件中。 今要求將上例建立的file1.dat文件中的內(nèi)容復(fù)制到另一個磁盤文件file2.dat中。解題思路:處理此問題的算法是:從file1.dat文件中逐個讀入字符,然后逐個輸出到file2.dat中。#include #
12、include int main( ) FILE *in,*out; char ch,infile10,outfile10; 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,則復(fù)制一個二進(jìn)制文件改為rb和wb,則復(fù)制一個二進(jìn)制文件 while
13、(!feof(in) ch=fgetc(in); fputc(ch,out); putchar(ch); putchar(10); fclose(in); fclose(out); return 0;檢查當(dāng)前讀寫位置是否移到文件末尾10.3.2 怎樣向文件讀寫一個字符串讀寫一個字符串的函數(shù)函數(shù)名調(diào)用形式功能返回值fgetsfgets(str,n,fp)從fp指向的文件讀入長度為(n-1)的字符串,存放到字符數(shù)組str中讀成功,返回地址str,失敗則返回NULL)fputsfputs(str,fp)str所指向的字符串寫到文件指針變量fp所指向的文件中寫成功,返回0;否則返回非0值說明:fget
14、s函數(shù)的函數(shù)原型為: char *fgets (char *str,int n,FILE *fp);其作用是從文件讀入一個字符串調(diào)用時(shí)可以寫成: fgets(str,n,fp);說明:fgets(str,n,fp);中n是要求得到的字符個數(shù),但實(shí)際上只讀n-1個字符,然后在最后加一個0字符,這樣得到的字符串共有n個字符,把它們放到字符數(shù)組str中如果在讀完n-1個字符之前遇到換行符“n”或文件結(jié)束符EOF,讀入即結(jié)束,但將所遇到的換行符“n”也作為一個字符讀入執(zhí)行fgets成功,返回str數(shù)組首地址,如果一開始就遇到文件尾或讀數(shù)據(jù)錯,返回NULL說明:fputs函數(shù)的函數(shù)原型為: int fp
15、uts (char *str, FILE *fp);str指向的字符串輸出到fp所指向的文件中調(diào)用時(shí)可以寫成: fputs(China”,fp);fputs函數(shù)中第一個參數(shù)可以是字符串常量、字符數(shù)組名或字符型指針字符串末尾的0不輸出輸出成功,函數(shù)值為;失敗,函數(shù)值為EOF 例10.3 從鍵盤讀入若干個字符串,對它們按字母大小的順序排序,然后把排好序的字符串送到磁盤文件中保存。解題思路:為解決問題,可分為三個步驟:從鍵盤讀入n個字符串,存放在一個二維字符數(shù)組中,每一個一維數(shù)組存放一個字符串;對字符數(shù)組中的n個字符串按字母順序排序,排好序的字符串仍存放在字符數(shù)組中;將字符數(shù)組中的字符串順序輸出。#
16、include #include #include int main() FILE *fp; char str310,temp10; int i,j,k,n=3; printf(“Enter strings:n”); for(i=0;in;i+) gets(stri); for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) strcpy(temp,stri); strcpy(stri,strk); strcpy(strk,temp); if(fp=fopen(“D:CCstring.dat”, “w”)=NULL) printf(cant open
17、 file!n); exit(0); printf(nThe new sequence:n); for(i=0;in;i+) fputs(stri,fp); fputs(“n”,fp); printf(“%sn”,stri); return 0;人為地輸出一個n思考:從文件string.dat中讀回字符串,并在屏幕上顯示,應(yīng)如何編寫程序?#include #include int main() FILE *fp; char str310; int i=0; if(fp=fopen(“D:CCstring.dat”, “r”)=NULL) printf(cant open file!n);exi
18、t(0); while(fgets(stri,10,fp)!=NULL) printf(%s,stri); i+; fclose (fp); return 0;不用人為地輸出n10.3.3用格式化的方式讀寫文件一般調(diào)用方式為:fprintf(文件指針,格式字符串,輸出表列);fscanf (文件指針,格式字符串,輸入表列);如:fprintf (fp,”%d,%6.2f”,i,f);fscanf (fp,”%d,%f”,&i,&f);10.3.4 用二進(jìn)制方式向文件讀寫一組數(shù)據(jù)一般調(diào)用形式為:fread(buffer,size,count,fp);fwrite(buffer,size,coun
19、t,fp); 10.3.4 用二進(jìn)制方式向文件讀寫一組數(shù)據(jù)buffer:是一個地址對fread來說,它是用來存放從文件讀入的數(shù)據(jù)的存儲區(qū)的地址對fwrite來說,是要把此地址開始的存儲區(qū)中的數(shù)據(jù)向文件輸出size:要讀寫的字節(jié)數(shù)count:要讀寫多少個數(shù)據(jù)項(xiàng)fp:FILE類型指針 例10.4 從鍵盤輸入10個學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤文件上去。 解題思路:定義有10個元素的結(jié)構(gòu)體數(shù)組,用來存放10個學(xué)生的數(shù)據(jù)從main函數(shù)輸入10個學(xué)生的數(shù)據(jù)用save函數(shù)實(shí)現(xiàn)向磁盤輸出學(xué)生數(shù)據(jù)用fwrite函數(shù)一次輸出一個學(xué)生的數(shù)據(jù)#include #define SIZE 10struct Stu
20、dent_type char name10; int num; int age; char addr15; studSIZE; void save( ) FILE *fp; int i; if(fp=fopen(stu.dat,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) if(fwrite(&studi, sizeof(struct Student_type), 1,fp)!=1) printf(file write errorn); fclose(fp);10+4+4+15=33,實(shí)際上開辟36字節(jié),是4的倍數(shù)當(dāng)前路徑下的文件int main() int i; printf(“enter data of students:n); for(i=0;iSIZE;i+) scanf(%s%d%d%s, ,&studi.num, &studi.age,studi.addr); save( ); return 0;為了驗(yàn)證在磁盤文件“stu.dat”中是否已存在此數(shù)據(jù),可以用以下程序從“stu.dat”文件中讀入數(shù)據(jù),然后在屏幕上輸出。#include #include #define SIZE 10struct
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車間級安全培訓(xùn)材料課件
- 2026年河南省機(jī)關(guān)事業(yè)單位工勤技能崗位等級考試題及答案殯葬服務(wù)工高級技
- 車間班組安全培訓(xùn)課件
- 車間工藝介紹課件
- 火箭行業(yè)智能制造發(fā)射與回收方案 (二)
- 車間安全培訓(xùn)效果課件
- 齊齊哈爾安全生產(chǎn)培訓(xùn)課件
- 2026年及未來5年市場數(shù)據(jù)中國微型載貨車行業(yè)全景評估及投資規(guī)劃建議報(bào)告
- 2026年智能八角籠項(xiàng)目商業(yè)計(jì)劃書
- 2026年觸控交互系統(tǒng)項(xiàng)目評估報(bào)告
- GB/T 4074.6-2024繞組線試驗(yàn)方法第6部分:熱性能
- DB32-T 4111-2021 預(yù)應(yīng)力混凝土實(shí)心方樁基礎(chǔ)技術(shù)規(guī)程
- 醫(yī)療衛(wèi)生機(jī)構(gòu)6S常態(tài)化管理打分表
- 幾種常用潛流人工濕地剖面圖
- 危險(xiǎn)源辨識、風(fēng)險(xiǎn)評價(jià)、風(fēng)險(xiǎn)控制措施清單-05變電站工程5
- 2023年副主任醫(yī)師(副高)-推拿學(xué)(副高)考試歷年真題摘選帶答案
- 朱子治家格言(朱子家訓(xùn))課件
- 20S517 排水管道出水口
- vpap iv st說明總體操作界面
- 初中一年級(7年級)上學(xué)期生物部分單元知識點(diǎn)
- 長興中學(xué)提前招生試卷
評論
0/150
提交評論