![c語言文件讀寫_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/aa53307a-c5e7-4a7f-9a86-7b79177de010/aa53307a-c5e7-4a7f-9a86-7b79177de0101.gif)
![c語言文件讀寫_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/aa53307a-c5e7-4a7f-9a86-7b79177de010/aa53307a-c5e7-4a7f-9a86-7b79177de0102.gif)
![c語言文件讀寫_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/aa53307a-c5e7-4a7f-9a86-7b79177de010/aa53307a-c5e7-4a7f-9a86-7b79177de0103.gif)
![c語言文件讀寫_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/aa53307a-c5e7-4a7f-9a86-7b79177de010/aa53307a-c5e7-4a7f-9a86-7b79177de0104.gif)
![c語言文件讀寫_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/aa53307a-c5e7-4a7f-9a86-7b79177de010/aa53307a-c5e7-4a7f-9a86-7b79177de0105.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一、文件操作概述所謂文件文件,是指存放在外部存儲(chǔ)介質(zhì)(可以是磁盤、光盤、磁存放在外部存儲(chǔ)介質(zhì)(可以是磁盤、光盤、磁帶等等)上數(shù)據(jù)的集合帶等等)上數(shù)據(jù)的集合。要想讀取外部存儲(chǔ)介質(zhì)中的數(shù)據(jù),必須先先按照文件名找到找到相應(yīng)的文件文件,然后然后再從文件中讀取數(shù)據(jù)讀取數(shù)據(jù)。要想將數(shù)據(jù)存放到外部存儲(chǔ)介質(zhì)中,首先先要在外部介質(zhì)上建立一個(gè)文件,然后然后再向文件寫入數(shù)據(jù)寫入數(shù)據(jù)。C語言將文件看成是一個(gè)字節(jié)序列。但從對(duì)文件中的數(shù)據(jù)的解釋方式來看,C語言區(qū)分兩種文件類型:文本文件文本文件和二進(jìn)制文件二進(jìn)制文件。文本文件中的每一個(gè)字節(jié)都是字符型數(shù)據(jù)每一個(gè)字節(jié)都是字符型數(shù)據(jù),整個(gè)文件的內(nèi)容就是多行文本;二進(jìn)制文件中的數(shù)
2、據(jù)看成是數(shù)值數(shù)據(jù)數(shù)值數(shù)據(jù),或復(fù)雜數(shù)據(jù)類型的數(shù)據(jù)復(fù)雜數(shù)據(jù)類型的數(shù)據(jù)。一般情況下,后綴是.txt,.c,.cpp,.h,.hpp,.ini等的文件大多是文本文件,后綴是.exe,.com,.dll,.lib,.dat,.doc,.tif等的文件大多是二進(jìn)制文件。二、文件指針在C語言看來,文件就是字節(jié)流,即字節(jié)序列。我們把按這這種方式處理的文件稱為流文件。C語言本身沒提供輸入輸出的功能,必須調(diào)用標(biāo)準(zhǔn)庫函數(shù)進(jìn)行文件讀寫。操作文件的過程中要用到一個(gè)重要的數(shù)據(jù)類型是文件指針。什么是文件指針呢?程序在操作文件過程中,必須保存有關(guān)文件的一些信息,比如,文件名、文件的狀態(tài)、當(dāng)前讀寫的位置等等。C語言將這些信息保
3、存在一個(gè)結(jié)構(gòu)體中,stdio.h文件中將這個(gè)結(jié)構(gòu)體類型定義為FILE:typedef struct int level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned char hold; /* Ungetc char if no buffer */ int bsize; /* Buffer size */ unsigned char _FAR *buffer; /* Data transfer buffer */
4、unsigned char _FAR *curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ FILE; /* This is the FILE object */二、文件指針C的標(biāo)準(zhǔn)庫函數(shù)每操作一個(gè)文件,都為這個(gè)文件建立一個(gè)FILE型變量。有了這個(gè)FILE型變量,C庫函數(shù)就將文件底層操作的細(xì)節(jié)與程序員隔離開,使文件操作的程序更容易編寫。在操作文件過程中,程序員只能獲取到FILE型的指針,這個(gè)
5、指針?biāo)赶虻腇ILE型變量存放著所操作文件的基本信息。這個(gè)FILE指針又稱文件類型指針文件類型指針。每個(gè)文件類型指針唯一唯一代表一個(gè)文件。例如,下面定義了一個(gè)文件類型指針:FILE *fp;這個(gè)fp指針將代表一個(gè)文件,對(duì)文件的任何操作都離不開這個(gè)文件類型的指針。三、文件的打開與關(guān)閉打開文件需要調(diào)用fopen函數(shù),關(guān)閉文件需要調(diào)用fclose函數(shù)。這兩個(gè)函數(shù)的原型如下:FILE *fopen(char *filename,char *mode);int fclose(FILE *stream);fopen函數(shù)帶有兩個(gè)參數(shù):第一個(gè)參數(shù)filename是要打開的文件名,第二個(gè)參數(shù)mode也是一個(gè)字符
6、串,這個(gè)字符串中的字符表示打開文件的方式。mode字符串由兩類字符構(gòu)成:一類字符表示打開文件的類型,t表示文本文件,b表示二進(jìn)制文件,如果不指定文件類型,默認(rèn)為文本文件;另一類字符是操作類型,r表示從文件中讀取數(shù)據(jù),w表示向文件寫入數(shù)據(jù),a表示在文件尾部追加數(shù)據(jù),+表示文件可讀可寫三、文件的打開與關(guān)閉例如,如果要?jiǎng)?chuàng)建一個(gè)文本文件,mode字符串應(yīng)該是:”wt”或”w”,如果要打開一個(gè)二進(jìn)制文件準(zhǔn)備讀取數(shù)據(jù),mode字符串應(yīng)該是:”rb”或”br”。函數(shù)fopen返回打開文件的文件指針,程序在讀寫和關(guān)閉文件時(shí),要用到這個(gè)指針。如果打開文件失敗,fopen返回NULL。函數(shù)fclose的功能是關(guān)閉
7、文件,要關(guān)閉的文件由參數(shù)stream指定,通常這個(gè)參數(shù)就是fopen函數(shù)的返回值。下面的程序打開和關(guān)閉了一個(gè)名為”exp09_01.c”的文件:FILE *fp;fp=fopen(exp09_01.c,r); /試圖打開該文件試圖打開該文件if(fp=NULL) printf(exp09_01.c not found); else . /讀取和加工數(shù)據(jù)讀取和加工數(shù)據(jù) fclose(fp); /關(guān)閉該文件關(guān)閉該文件 四、文件的讀寫文件的讀寫需要調(diào)用fscanf, fprintf, fgets, fputs, fgetc, fputc, fread, fwrite等標(biāo)準(zhǔn)庫函數(shù)。1.fscanf和和
8、fprintf函數(shù)函數(shù)scanf函數(shù)的第一個(gè)參數(shù)是格式控制字符串,后面的參數(shù)是變量的地址。fscanf函數(shù)的第一個(gè)參數(shù)是文件類型的指針,第二個(gè)參數(shù)是格式控制字符串,在后面的參數(shù)才是變量的地址,它的功能是從文件中讀取數(shù)據(jù)。int a;float f;FILE *fp;scanf(%d,%f,&a,&f); /從鍵盤讀取變量從鍵盤讀取變量a和和f的值的值fp=fopen(yang.dat, rb); /以只讀方式打開以只讀方式打開yang.dat文件文件if(fp!=NULL) fscanf(fp, %d,%f,&a,&f); /從文件中讀取變量從文件中讀取變量a和
9、和f的值的值 fclose(fp); /關(guān)閉該文件關(guān)閉該文件 如果遇到文件尾,fscanf函數(shù)返回EOF。四、文件的讀寫printf函數(shù)的第一個(gè)參數(shù)是格式控制字符串,后面的參數(shù)是要輸出的表達(dá)式列表。與它不同,fprintf函數(shù)的第一個(gè)參數(shù)是文件指針,第二個(gè)參數(shù)是格式控制字符串,在后面的參數(shù)是要輸出的表達(dá)式列表,它的功能是將表達(dá)式輸出到文件中。int a=100;float f=3.1;FILE *fp;printf (a=%d,f=%f,a,f); /輸出輸出a和和f的值的值fp=fopen(yang.dat, wb); /創(chuàng)建創(chuàng)建yang.dat文件文件if(fp!=NULL) fprint
10、f (fp, a=%d,f=%f,a,f); /將變量將變量a和和f的值寫入到的值寫入到文件中文件中 fclose(fp); /關(guān)閉該文件關(guān)閉該文件 如果輸出數(shù)據(jù)成功,fprintf函數(shù)返回寫到文件中的數(shù)據(jù)的字節(jié)個(gè)數(shù),否則返回EOF。四、文件的讀寫2.fgetc和和fputc函數(shù)函數(shù)這兩個(gè)函數(shù)的原型是:int fgetc(FILE *stream);int fputc(int c,FILE *stream);fgetc函數(shù)的功能是從stream所代表的文件中讀取一個(gè)字節(jié),返回值是讀取的字節(jié)值,如果遇到文件尾或出錯(cuò),它返回如果遇到文件尾或出錯(cuò),它返回EOF。fputc函數(shù)的功能是將一字符c輸出到
11、stream所代表的文件中,返回值是返回值是c的值,如果出錯(cuò),則返回的值,如果出錯(cuò),則返回EOF。#include void main() char str10,ch; int k; FILE *fp1,*fp2; fp1=fopen(“yang.txt”,”wt”); /創(chuàng)建文本文件yang.txt if(fp1!=NULL) scanf(“%8s”,str); /或取字符串 for(k=0;kstrlen(str);k+) fputc(strk,fp1); /將字符串的內(nèi)容寫入文件 fclose(fp1); /關(guān)閉文件 下面的程序?qū)⑤斎氲淖址畬懭氲轿募?,然后再將字符下面的程序?qū)⑤斎氲淖?/p>
12、符串寫入到文件中,然后再將字符串從文件中讀出:串從文件中讀出: fp2=fopen(“yang.txt”,”rt”); /以只讀方式打開yang.txt文件 k=0; while(1) ch=fgetc(fp2); /從文件中讀取一個(gè)字符 if(ch=EOF)break; /如果遇到文件尾,則跳出循環(huán) strk+=ch; /否則將讀取的字符存放到str中 strk=0; /為字符串增加結(jié)尾字符0 printf(“%s”,str); /如果創(chuàng)建yang.txt文件成功下面的程序?qū)⑤斎氲淖址畬懭氲轿募?,然后再將字符下面的程序?qū)⑤斎氲淖址畬懭氲轿募?,然后再將字符串從文件中讀出:串從文件中讀出
13、:四、文件的讀寫3. fgets和和fputs函數(shù)函數(shù)fgets和fputs函數(shù)的原型是:char *fgets(char *s, int n, FILE *stream);int fputs(char *s, FILE *stream);fgets函數(shù)的功能是從stream所代表的文件中讀取長度最大為長度最大為n-1的字符串,并將字符串存放到s中。當(dāng)從文件中讀取第當(dāng)從文件中讀取第n-1個(gè)字符后或讀取個(gè)字符后或讀取數(shù)據(jù)過程中遇到換行符數(shù)據(jù)過程中遇到換行符n后,函數(shù)返回后,函數(shù)返回。因此,s中存放的字符串的長度不一定正好是n-1。fgets會(huì)為這個(gè)字符串增加結(jié)尾符0。fputs函數(shù)的功能是將存放
14、在s中的字符串寫到stream所代表的文件中。如果操作成功,fputs函數(shù)返回最后寫入文件的字符值,如果出錯(cuò),函數(shù)返回最后寫入文件的字符值,如果出錯(cuò),fputs函數(shù)返回函數(shù)返回EOF。如果操作成功,fgets函數(shù)返回字符串的指針;如果遇到文件尾或者出錯(cuò),fgets返回NULL。fputs函數(shù)不會(huì)將字符串結(jié)尾符0寫入文件,也不會(huì)自動(dòng)向文件中寫入換行符,如果需要寫入一行文本,fputs函數(shù)的s字符串必須包含n。 fp2=fopen(yang.txt,rt); /以只讀方式打開yang.txt文件 fgets(str,8,fp2); /讀取字符串,最大長度是7,將是”1234567” printf(
15、%s,str); fgets(str,8,fp2); /讀取字符串,最大長度是7,實(shí)際上將是”89n” printf(%s,str); fclose(fp2); /關(guān)閉文件下面的程序?qū)⑾蛭募旅娴某绦驅(qū)⑾蛭募ang.txt中寫入兩行文本,然后分中寫入兩行文本,然后分兩次讀出其中的一行兩次讀出其中的一行#include void main()char str10=123456789;FILE *fp1,*fp2;fp1=fopen(yang.txt,wt); /創(chuàng)建文本文件yang.txtif(fp1!=NULL) fputs(str,fp1); /將字符串”123456789”寫入文件 fp
16、uts(nabcd,fp1); /寫入第一行文本的換行符和下一行文本 fclose(fp1); /關(guān)閉文件/如果創(chuàng)建yang.txt文件成功四、文件的讀寫4. fread和fwrite函數(shù)fread和fwrite函數(shù)的原型是:unsigned fread(void *ptr, unsigned size, unsigned n,FILE *stream);unsigned fwrite(void *ptr,unsigned size, unsigned n,FILE*stream);fread函數(shù)的功能是從stream所代表的文件中讀取n個(gè)數(shù)據(jù)項(xiàng),每個(gè)數(shù)據(jù)項(xiàng)的大小是size字節(jié),這些數(shù)據(jù)將被存
17、放到ptr所指向的內(nèi)存中。fwrite函數(shù)的功能是將ptr所指向的內(nèi)存中存放的n個(gè)大小為size個(gè)字節(jié)的數(shù)據(jù)項(xiàng)寫入stream所代表的文件中,實(shí)際要寫入數(shù)據(jù)的字節(jié)數(shù)是(n*size)。fread和fwrite可以用來讀寫任意類型的數(shù)據(jù),可以是簡單類型,也可以是數(shù)組或結(jié)構(gòu)體類型。如果操作成功,fread返回讀取的數(shù)據(jù)項(xiàng)的個(gè)數(shù)(不是字節(jié)的個(gè)數(shù)),如果操作出錯(cuò),fread可能返回0。如果操作成功,fwrite函數(shù)返回實(shí)際寫入的數(shù)據(jù)項(xiàng)的個(gè)數(shù)(不是字節(jié)個(gè)數(shù))。如果操作不成功,可能返回0。下面的程序先將一個(gè)int型數(shù)組存放到文件中,然后再讀出來:#include void main()int a10=10
18、,20,30,40,50,60,70,80,90,100;int k;FILE *fp1,*fp2;fp1=fopen(yang.dat,wb); /創(chuàng)建二進(jìn)制文件yang.datif(fp1!=NULL) fwrite(a,sizeof(int),10,fp1); /將數(shù)組a的10個(gè)整數(shù)寫入文件 fclose(fp1); /關(guān)閉文件 fp2=fopen(yang.dat,rb); /以只讀方式打開yang.dat文件 fread(a,sizeof(int),10,fp2);/從文件中讀出10個(gè)整數(shù)值放到a中 fclose(fp2); /關(guān)閉文件 for(k=0;k10;k+) printf(
19、%d ,ak); /輸出讀取的整數(shù) /如果創(chuàng)建yang.dat文件成功五、文件的定位讀寫在文件讀寫過程中,操作系統(tǒng)為每個(gè)打開的文件設(shè)置了一個(gè)位置指針,指向當(dāng)前讀寫數(shù)據(jù)的位置。每次讀寫一個(gè)字節(jié)后,這個(gè)指針向后移動(dòng)一個(gè)字節(jié)的位置。文件的位置指針不是一個(gè)指針型數(shù)據(jù),僅僅是一個(gè)無符號(hào)長整型數(shù)據(jù),用來表示當(dāng)前讀寫的位置。文件的位置指針的最小值是0,最大值是文件的長度。文件被打開時(shí),文件的位置指針位于文件頭部隨著數(shù)據(jù)的讀寫,文件的位置指針會(huì)向后移動(dòng)。文件的位置指針也可以通過程序來改變,這需要調(diào)用rewind,fseek等函數(shù)。如果想知道文件指針的位置,可以調(diào)用ftell函數(shù)。1.rewind函數(shù)函數(shù)rew
20、ind函數(shù)的原型:void rewind(FILE * stream);rewind函數(shù)的功能是將stream所代表文件的位置指針重新置回到文件的開頭。五、文件的定位讀寫2. fseek函數(shù)函數(shù)fseek函數(shù)的原型:int fseek(FILE * stream,long offset, int whence);fseek函數(shù)的功能是將stream所表示的文件位置指針移動(dòng)到特定的位置。這個(gè)特定位置由whence和offset決定:即將位置指針移到距離whence的offset字節(jié)處。whence可以是下列值之一:offset可以是負(fù)值。如果offset是正值,表明新的位置在whence的后面,如果offset是負(fù)值,表明新的位
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年裝卸機(jī)械項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模式
- 2025年上海高級(jí)商場物業(yè)管理續(xù)簽合同協(xié)議
- 2025年膠片型相機(jī)、CCD相機(jī)、紅外相機(jī)、恒星相機(jī)項(xiàng)目規(guī)劃申請(qǐng)報(bào)告模板
- 2025年勞動(dòng)合同法續(xù)約條件規(guī)定
- 優(yōu)化農(nóng)業(yè)產(chǎn)業(yè)供應(yīng)鏈的合同范例2025年
- 2025年設(shè)備租賃展示合同范本
- 2025年公共交通廣告安裝服務(wù)協(xié)議
- 2025年上海技術(shù)顧問合同
- 2025年建筑項(xiàng)目材料采購申請(qǐng)及供銷協(xié)議
- 2025年二手房產(chǎn)交易定金給付合同協(xié)議樣本
- GB/T 35506-2017三氟乙酸乙酯(ETFA)
- GB/T 25784-20102,4,6-三硝基苯酚(苦味酸)
- GB/T 21114-2007耐火材料X射線熒光光譜化學(xué)分析熔鑄玻璃片法
- 特種設(shè)備安全監(jiān)察指令書填寫規(guī)范(特種設(shè)備安全法)參考范本
- 航空維修工程管理-第1章課件
- 《長方形的面積》-完整版課件
- 五年級(jí)上冊(cè)英語Module6Unit1Youcanplaybasketballwell外研社課件
- 工業(yè)企業(yè)現(xiàn)場監(jiān)測工況核查表
- 沉淀池及排水溝清理記錄表
- 玩具公司職位說明書匯編
- ic半導(dǎo)體測試基礎(chǔ)(中文版)參考范本
評(píng)論
0/150
提交評(píng)論