




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用目錄一、文件和流1、程序文件2、數(shù)據(jù)文件3、流二、文件組成三、文件的打開和關(guān)閉1、文件的打開fopen2、文件關(guān)閉fclose四、文件的順序讀寫1、使用fputc和fgetc寫入/讀取單個(gè)字符2、使用fputs和fgets寫入/讀取一串字符3、使用fprintf和fscanf按照指定的格式寫入/讀取4、使用fwrite和fread按照二進(jìn)制的方式寫入/讀取5、使用sprintf和sscanf將格式化數(shù)據(jù)和字符串互相轉(zhuǎn)換(文件無(wú)關(guān))五、文件的隨機(jī)讀寫1、fseek(指定文件指針的位置)2、ftell(求文件指針與起始位置的偏移量)3、rewind(讓文件指針回到起始位置)六、文本文件和二進(jìn)制文件的區(qū)別七、文件讀取結(jié)束的標(biāo)志八、文件緩沖區(qū)
一、文件和流
1、程序文件
包括源程序文件(后綴為.c)
目標(biāo)文件(windows環(huán)境后綴為.obj)
可執(zhí)行程序(windows環(huán)境后綴為.exe)
2、數(shù)據(jù)文件
文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件。
3、流
任何一個(gè)C程序,運(yùn)行起來(lái)就會(huì)默認(rèn)打開3個(gè)流
1、FILE*stdin(標(biāo)準(zhǔn)輸入流,鍵盤)
2、FILE*stdout(標(biāo)準(zhǔn)輸出流,顯示器)
3、FILE*stderr(標(biāo)準(zhǔn)錯(cuò)誤流,顯示器)
流可以理解為輸入/輸出緩沖區(qū)
二、文件組成
每個(gè)被使用的文件都在內(nèi)存中開辟了一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)聲明的,取名FILE
FILE*就是文件指針類型,可以通過(guò)文件指針找到它指向的文件信息區(qū)(FILE類型的結(jié)構(gòu)體),文件信息區(qū)用于維護(hù)一個(gè)文件(每個(gè)文件都是獨(dú)立的文件信息區(qū))
三、文件的打開和關(guān)閉
1、文件的打開fopen
filename是文件名
mode是文件打開方式
文件打開方式含義如果指定文件不存在r(只讀)為了輸入數(shù)據(jù),打開一個(gè)已經(jīng)存在的文本文件出錯(cuò)w(只寫)為了輸出數(shù)據(jù),打開一個(gè)文本文件建立一個(gè)新的文件a(追加)向文本文件尾添加數(shù)據(jù)建立一個(gè)新的文件rb(只讀)為了輸入數(shù)據(jù),打開一個(gè)二進(jìn)制文件出錯(cuò)wb(只寫)為了輸出數(shù)據(jù),打開一個(gè)二進(jìn)制文件建立一個(gè)新的文件ab(追加)向一個(gè)二進(jìn)制文件尾添加數(shù)據(jù)出錯(cuò)r+(讀寫)為了讀和寫,打開一個(gè)文本文件出錯(cuò)w+(讀寫)為了讀和寫,新建一個(gè)文本文件建立一個(gè)新的文件a+(讀寫)打開一個(gè)文件,在文件尾進(jìn)行讀寫建立一個(gè)新的文件rb+(讀寫)為了讀和寫打開一個(gè)二進(jìn)制文件出錯(cuò)wb+(讀寫)為了讀和寫,新建一個(gè)新的二進(jìn)制文件建立一個(gè)新的文件ab+(讀寫)打開一個(gè)二進(jìn)制文件,在文件尾進(jìn)行讀和寫建立一個(gè)新的文件
2、文件關(guān)閉fclose
stream是文件指針,文件使用完后一定要fclose關(guān)閉,并把文件指針置空。(用起來(lái)像free)
intmain()
FILE*pf=fopen("text.txt","r");//文件路徑可以是相對(duì)路徑或絕對(duì)路徑
if(pf==NULL)
printf("%s\n",strerror(errno));
exit(-1);
fclose(pf);//不關(guān)閉文件可能會(huì)造成數(shù)據(jù)丟失
pf=NULL;
return0;
四、文件的順序讀寫
字符輸入函數(shù)fgetc所有輸入流字符輸出函數(shù)fputc所有輸出流文本行輸入函數(shù)fgets所有輸入流文本行輸出函數(shù)fputs所有輸出流格式化輸入函數(shù)fscanf所有輸入流格式化輸出函數(shù)fprintf所有輸出流二進(jìn)制輸入fread文件二進(jìn)制輸出fread文件
1、使用fputc和fgetc寫入/讀取單個(gè)字符
寫入單個(gè)字符到文件
character:要寫入的字符
stream:指向輸出流FILE對(duì)象的指針。
intmain()
FILE*pf=fopen("text.txt","w");//文件路徑可以是相對(duì)路徑或絕對(duì)路徑
if(pf==NULL)
printf("%s\n",strerror(errno));
//perror("fopen");//voidperror(constchar*str)用來(lái)將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)設(shè)備(stderr)
exit(-1);
for(chari='a';i='z';i++)
fputc(i,pf);//輸出
fclose(pf);
pf=NULL;
}
讀取文件中的單個(gè)字符
stream:指向輸入流FILE對(duì)象的指針。
intmain()
pf=fopen("text.txt","r");//文件路徑可以是相對(duì)路徑或絕對(duì)路徑
if(pf==NULL)
printf("%s\n",strerror(errno));
exit(-1);
printf("%c\n",fgetc(pf));//輸入,也可以寫一個(gè)循環(huán)讀取
printf("%c\n",fgetc(pf));
printf("%c\n",fgetc(pf));
printf("%c\n",fgetc(pf));
printf("%c\n",fgetc(pf));
fclose(pf);
pf=NULL;
return0;
}
2、使用fputs和fgets寫入/讀取一串字符
寫入一串字符到文件
str:要寫入的字符串的地址
stream:指向輸出流FILE對(duì)象的指針。
intmain()
FILE*pf=fopen("text.txt","w");
if(pf==NULL)
perror("fopen:");
exit(-1);
chararr[]="abcde";//text.txt文件被寫入abcde
fputs(arr,pf);
fclose(pf);
pf=NULL;
return0;
}
讀取文件中num個(gè)字符
str:讀到的字符串放到str指向的空間里去
num:讀取的字符串個(gè)數(shù)
stream:指向輸入流FILE對(duì)象的指針。
讀取成功:返回str的地址
讀取失敗或錯(cuò)誤:返回空指針
監(jiān)視發(fā)現(xiàn),我們從文件中讀取5個(gè)字符,實(shí)際只讀了4個(gè),最后一個(gè)補(bǔ)了\0
3、使用fprintf和fscanf按照指定的格式寫入/讀取
stream:指向輸出流FILE對(duì)象的指針。
后續(xù)參數(shù)使用方法與printf一樣
structS
charname[20];
inttele;
floatscores;
intmain()
structSs={"zhangsan",1510,66.5f};
FILE*pf=fopen("text.txt","w");
if(pf==NULL)
perror("fopen:");
exit(-1);
fprintf(pf,"%s%d%f",,s.tele,s.scores);//打印到txt文件
fprintf(stdout,"%s%d%f",,s.tele,s.scores);//打印到屏幕
fclose(pf);
pf=NULL;
return0;
}
stream:指向輸入流FILE對(duì)象的指針。
后續(xù)參數(shù)使用方法和scanf一樣
structS
charname[20];
inttele;
floatscores;
intmain()
structSs={0};
FILE*pf=fopen("text.txt","r");
if(pf==NULL)
perror("fopen:");
exit(-1);
fscanf(pf,"%s%d%f",,s.tele,s.scores);//將文件中的內(nèi)容讀取到結(jié)構(gòu)體中
printf("%s%d%f",,s.tele,s.scores);
fclose(pf);
pf=NULL;
return0;
}
4、使用fwrite和fread按照二進(jìn)制的方式寫入/讀取
ptr:從ptr指向的當(dāng)前位置開始寫入
size:每個(gè)元素的大小
count:要寫入的元素個(gè)數(shù)
stream:指向輸出流FILE對(duì)象的指針。
structS
charname[20];
inttele;
floatscores;
intmain()
structSs={"zhangsan",1510,66.5f};
FILE*pf=fopen("text.txt","wb");
if(pf==NULL)
perror("fopen:");
exit(-1);
fwrite(s,sizeof(structS),1,pf);
fclose(pf);
pf=NULL;
return0;
}
fread參數(shù)和fwrite一樣
ptr:從ptr指向的當(dāng)前位置開始讀取
structS
charname[20];
inttele;
floatscores;
intmain()
structSs={0};
FILE*pf=fopen("text.txt","rb");
if(pf==NULL)
perror("fopen:");
exit(-1);
fread(s,sizeof(structS),1,pf);
printf("%s%d%f",,s.tele,s.scores);
fclose(pf);
pf=NULL;
return0;
}
5、使用sprintf和sscanf將格式化數(shù)據(jù)和字符串互相轉(zhuǎn)換(文件無(wú)關(guān))
將格式化數(shù)據(jù)轉(zhuǎn)換為字符串
str:將格式化數(shù)據(jù)放到目標(biāo)地址
后續(xù)參數(shù)和使用方式和printf一樣
structS
charname[20];
inttele;
floatscores;
intmain()
structSs={"zhangsan",1510,66.5f};
chararr[60]={0};
sprintf(arr,"%s%d%f",,s.tele,s.scores);
printf("%s",arr);
return0;
}
將字符串轉(zhuǎn)換為格式化數(shù)據(jù)
s:指向字符串的指針
后續(xù)參數(shù)和使用方式和scanf一樣
structS
charname[20];
inttele;
floatscores;
intmain()
structSs={0};
chararr[60]={"zhangsan151066.5f"};
sscanf(arr,"%s%d%f",,s.tele,s.scores);
printf("%s%d%f",,s.tele,s.scores);
return0;
五、文件的隨機(jī)讀寫
1、fseek(指定文件指針的位置)
注意:每次文件讀取完畢后,文件指針++
stream:指向標(biāo)識(shí)流的FILE對(duì)象的指針
offset:指針偏移量
origin:指針起始點(diǎn),如下圖:
SEEK_SET文件開頭SEEK_CUR文件指針的當(dāng)前所處的位置SEEK_END文件結(jié)尾
intmain()
FILE*pf=fopen("text.txt","r+");
if(pf==NULL)
perror("fopen:");
exit(-1);
fputs("abcde",pf);
fseek(pf,2,SEEK_SET);
intch=fgetc(pf);//該語(yǔ)句執(zhí)行完畢后,指針++,指向d
printf("%c",ch);//打印c
fseek(pf,0,SEEK_CUR);
ch=fgetc(pf);//該語(yǔ)句執(zhí)行完畢后,指針++,指向e
printf("%c",ch);//打印d
fseek(pf,-1,SEEK_END);//這里SEEK_END是指向e的后一個(gè)
ch=fgetc(pf);//該語(yǔ)句執(zhí)行完畢后,指針++,指向e的后一個(gè)
printf("%c",ch);//打印e
fclose(pf);
pf=NULL;
return0;
}
2、ftell(求文件指針與起始位置的偏移量)
intmain()
FILE*pf=fopen("text.txt","r+");
if(pf==NULL)
perror("fopen:");
exit(-1);
fputs("abcde",pf);
fseek(pf,-1,SEEK_END);//這里SEEK_END是指向e的后一個(gè)
intch=fgetc(pf);//該語(yǔ)句執(zhí)行完畢后,指針++,指向e的后一個(gè)
printf("%c",ch);//打印e
printf("%d",ftell(pf));//打印5,當(dāng)前指針在e的后一個(gè),相對(duì)于a
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CANA 001-2020電子商務(wù)數(shù)權(quán)評(píng)價(jià)標(biāo)準(zhǔn)
- 在線刷java面試題及答案
- 丹陽(yáng)小學(xué)面試題及答案
- 創(chuàng)新求變面試題及答案
- 印章使用借用管理制度
- T/CAEPI 31-2021旋轉(zhuǎn)式沸石吸附濃縮裝置技術(shù)要求
- 《春天來(lái)了》教學(xué)設(shè)計(jì)
- 木材機(jī)械出售轉(zhuǎn)讓協(xié)議書
- 大型公司資產(chǎn)轉(zhuǎn)讓協(xié)議書
- 拎包入住合同解除協(xié)議書
- 版式設(shè)計(jì)課件3,網(wǎng)格系統(tǒng)全攻略
- 船舶防臺(tái)風(fēng)安全安全知識(shí)
- 汽機(jī)發(fā)電量計(jì)算
- GB∕T 1457-2022 夾層結(jié)構(gòu)滾筒剝離強(qiáng)度試驗(yàn)方法
- 康復(fù)治療技術(shù)(康復(fù)養(yǎng)老服務(wù))專業(yè)群建設(shè)方案
- 靜音房聲學(xué)設(shè)計(jì)方案
- 第五章結(jié)型場(chǎng)效應(yīng)晶體管
- 麗聲北極星自然拼讀繪本第一級(jí)Uncle Vic‘s Wagon 課件
- 四年級(jí)滬教版語(yǔ)文下冊(cè)閱讀理解專項(xiàng)習(xí)題含答案
- 2019幼兒園家委會(huì)PPT
- T∕CAAA 002-2018 燕麥 干草質(zhì)量分級(jí)
評(píng)論
0/150
提交評(píng)論