版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C語言文件操作之fread函數(shù)詳解目錄前言一、fread函數(shù)二、緩沖區(qū)受限的情況(循環(huán)讀取文件|feof函數(shù)判定文件讀取完畢)三、處理亂碼問題四、記錄讀取的字節(jié)個數(shù)五、讀取到0字節(jié)的情況六、讀取完畢的情況七、讀取文本文件\n與讀取二進(jìn)制文件\r\n區(qū)別總結(jié)
前言
二進(jìn)制文件讀寫兩個重要的函數(shù),fread和fwrite,fread用于讀取文件,fwrite用于寫出文件;
fread/fwrite函數(shù)既可以操作二進(jìn)制文件,又可以操作文本文件;
getc/putc函數(shù),fscanf/fprintf函數(shù),fgets/fgets函數(shù),只能用于操作文本文件;
一、fread函數(shù)
fread函數(shù)作用:從文件中讀取若干字節(jié)數(shù)據(jù)到內(nèi)存緩沖區(qū)中;
fread函數(shù)原型:
size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);
void*buffer參數(shù):將文件中的二進(jìn)制數(shù)據(jù)讀取到該緩沖區(qū)中;
size_tsize參數(shù):讀取的基本單元字節(jié)大小,單位是字節(jié),一般是buffer緩沖的單位大小;
如果buffer緩沖區(qū)是char數(shù)組,則該參數(shù)的值是sizeof(char);如果buffer緩沖區(qū)是int數(shù)組,則該參數(shù)的值是sizeof(int);
size_tcount參數(shù):讀取的基本單元個數(shù);
FILE*stream參數(shù):文件指針;
size_t返回值:實際從文件中讀取的基本單元個數(shù);讀取的字節(jié)數(shù)是基本單元數(shù)*基本單元字節(jié)大小;
代碼示例:一次性讀滿整個緩沖區(qū);
#includestdio.h
intmain()
//使用"rb"讀取二進(jìn)制方式打開文件
FILE*p=fopen("D:\\a.txt","rb");
//用于接收讀取數(shù)據(jù)的緩沖區(qū)
charbuffer[1024]={0};
//buffer:將文件讀取到內(nèi)存的位置
//sizeof(char):讀取的基本單元字節(jié)長度
//sizeof(buffer):讀取的基本單元個數(shù),
//讀取字節(jié)個數(shù)是sizeof(buffer)*sizeof(char)
//p:文件指針
fread(buffer,sizeof(char),sizeof(buffer),p);
//打印讀取的內(nèi)容
printf("buffer=%s\n",buffer);
printf("MainEnd\n");
return0;
執(zhí)行結(jié)果:
二、緩沖區(qū)受限的情況(循環(huán)讀取文件|feof函數(shù)判定文件讀取完畢)
假設(shè)緩沖區(qū)很小,文件很大,則需要循環(huán)讀取文件數(shù)據(jù);
使用feof(p)判定文件是否讀取完畢,如果返回true說明文件沒有讀取完畢,返回false,說明文件讀取完畢;
代碼示例:
#includestdio.h
intmain()
//使用"rb"讀取二進(jìn)制方式打開文件
FILE*p=fopen("D:\\a.txt","rb");
//用于接收讀取數(shù)據(jù)的緩沖區(qū)
charbuffer[4]={0};
while(!feof(p)){
memset(buffer,0,sizeof(buffer));
//buffer:將文件讀取到內(nèi)存的位置
//sizeof(char):讀取的基本單元字節(jié)長度
//sizeof(buffer):讀取的基本單元個數(shù),
//讀取字節(jié)個數(shù)是sizeof(buffer)*sizeof(char)
//p:文件指針
fread(buffer,sizeof(char),sizeof(buffer),p);
//打印讀取的內(nèi)容
printf("buffer=%s\n",buffer);
printf("MainEnd\n");
return0;
執(zhí)行結(jié)果:讀取之后出現(xiàn)亂碼,這是由于每次讀取101010字節(jié),但是字符串必須要以\0進(jìn)行結(jié)尾,如果沒有\(zhòng)0則會一直讀取直到出現(xiàn)\0字符串結(jié)尾位置;
三、處理亂碼問題
為了避免上述打印出現(xiàn)亂碼的情況,charbuffer[4]={0};準(zhǔn)備了444字節(jié)緩沖區(qū),每次只使用其中的333個字節(jié),這就能保證最后一個字節(jié)必定是\0,打印時就不會出現(xiàn)亂碼;
代碼示例:
#includestdio.h
intmain()
//使用"rb"讀取二進(jìn)制方式打開文件
FILE*p=fopen("D:\\a.txt","rb");
//用于接收讀取數(shù)據(jù)的緩沖區(qū)
charbuffer[4]={0};
while(!feof(p)){
memset(buffer,0,sizeof(buffer));
//buffer:將文件讀取到內(nèi)存的位置
//sizeof(char):讀取的基本單元字節(jié)長度
//sizeof(buffer):讀取的基本單元個數(shù),
//讀取字節(jié)個數(shù)是sizeof(buffer)*sizeof(char)
//p:文件指針
fread(buffer,sizeof(char),sizeof(buffer)-1,p);
//打印讀取的內(nèi)容
printf("buffer=%s\n",buffer);
printf("MainEnd\n");
return0;
執(zhí)行結(jié)果:每次從文件中讀取緩沖區(qū)字節(jié)數(shù)-1個字節(jié),則能完整的將文本打印出來;
四、記錄讀取的字節(jié)個數(shù)
fread函數(shù)返回值表示讀取到的基本單元的個數(shù),如果設(shè)置了1KB的緩沖區(qū),但是文件中只有5字節(jié),則fread的返回值就是實際讀取到的數(shù)據(jù)個數(shù);
代碼示例:
#includestdio.h
intmain()
//使用"rb"讀取二進(jìn)制方式打開文件
FILE*p=fopen("D:\\a.txt","rb");
//用于接收讀取數(shù)據(jù)的緩沖區(qū)
charbuffer[1024]={0};
//buffer:將文件讀取到內(nèi)存的位置
//sizeof(char):讀取的基本單元字節(jié)長度
//sizeof(buffer):讀取的基本單元個數(shù),
//讀取字節(jié)個數(shù)是sizeof(buffer)*sizeof(char)
//p:文件指針
//返回值:fread函數(shù)返回值表示讀取到的基本單元的個數(shù)
size_tcount=fread(buffer,sizeof(char),sizeof(buffer)-1,p);
//打印讀取的內(nèi)容
printf("buffer=%s,readcount=%u\n",buffer,count);
printf("MainEnd\n");
return0;
執(zhí)行結(jié)果:
五、讀取到0字節(jié)的情況
如果基本單元大小444字節(jié),文件中只有333字節(jié)數(shù)據(jù),則使用fread函數(shù)讀取文件,緩沖區(qū)設(shè)置1KB,則實際讀取到的基本單元個數(shù)是000;
代碼示例:
#includestdio.h
intmain()
//使用"rb"讀取二進(jìn)制方式打開文件
FILE*p=fopen("D:\\a.txt","rb");
//用于接收讀取數(shù)據(jù)的緩沖區(qū)
charbuffer[1024]={0};
//buffer:將文件讀取到內(nèi)存的位置
//sizeof(char):讀取的基本單元字節(jié)長度
//sizeof(buffer):讀取的基本單元個數(shù),
//讀取字節(jié)個數(shù)是sizeof(buffer)*sizeof(char)
//p:文件指針
//返回值:fread函數(shù)返回值表示讀取到的基本單元的個數(shù)
size_tcount=fread(buffer,sizeof(int),sizeof(buffer)-1,p);
//打印讀取的內(nèi)容
printf("buffer=%s,readcount=%u\n",buffer,count);
printf("MainEnd\n");
return0;
執(zhí)行結(jié)果:
六、讀取完畢的情況
如果文件已經(jīng)讀取完畢,不關(guān)閉文件,再次調(diào)用fread函數(shù)繼續(xù)讀取,則讀取到的基本單元個數(shù)是000;
使用feof(p)判定文件是否讀取完畢,如果返回true說明文件沒有讀取完畢,返回false,說明文件讀取完畢;
代碼示例:
#includestdio.h
intmain()
//使用"rb"讀取二進(jìn)制方式打開文件
FILE*p=fopen("D:\\a.txt","rb");
//用于接收讀取數(shù)據(jù)的緩沖區(qū)
charbuffer[1024]={0};
//buffer:將文件讀取到內(nèi)存的位置
//sizeof(char):讀取的基本單元字節(jié)長度
//sizeof(buffer):讀取的基本單元個數(shù),
//讀取字節(jié)個數(shù)是sizeof(buffer)*sizeof(char)
//p:文件指針
//返回值:fread函數(shù)返回值表示讀取到的基本單元的個數(shù)
size_tcount=fread(buffer,sizeof(char),sizeof(buffer)-1,p);
//打印第一次讀取的內(nèi)容
printf("Firstfread:buffer=%s,readcount=%u\n",buffer,count);
count=fread(buffer,sizeof(int),sizeof(buffer)-1,p);
//打印第二次讀取的內(nèi)容
printf("Secondfread:buffer=%s,readcount=%u\n",buffer,count);
printf("MainEnd\n");
return0;
執(zhí)行結(jié)果:
七、讀取文本文件\n與讀取二進(jìn)制文件\r\n區(qū)別
以下區(qū)別只在Windows系統(tǒng)存在,在Linux/Unix中讀取文本數(shù)據(jù)與二進(jìn)制數(shù)據(jù)沒有區(qū)別;
使用rb方式打開文件,讀取二進(jìn)制文件,然后調(diào)用fread函數(shù)讀取文件,
#includestdio.h
intmain()
//使用"rb"讀取二進(jìn)制方式打開文件
FILE*p=fopen("D:\\a.txt","rb");
//用于接收讀取數(shù)據(jù)的緩沖區(qū)
charbuffer[1024]={0};
//buffer:將文件讀取到內(nèi)存的位置
//sizeof(char):讀取的基本單元字節(jié)長度
//sizeof(buffer):讀取的基本單元個數(shù),
//讀取字節(jié)個數(shù)是sizeof(buffer)*sizeof(char)
//p:文件指針
//返回值:fread函數(shù)返回值表示讀取到的基本單元的個數(shù)
size_tcount=fread(buffer,sizeof(char),sizeof(buffer)-1,p);
//打印第一次讀取的內(nèi)容
printf("fread:buffer=%s,readcount=%u\n",buffer,count);
//逐個字節(jié)打印讀取出數(shù)據(jù)的ASCII碼
inti=0;
for(i=0;icount;i++){
printf("buffer[%d]=%x\n",i,buffer[i]);
printf("MainEnd\n");
return0;
執(zhí)行結(jié)果:第222個索引讀取出來的值是0xd對應(yīng)\r,第333個值是0xa對應(yīng)\n;
注意:最后兩個字節(jié)是空行對應(yīng)的\r\n;
fread:buffer=ab
,readcount=8
buffer[0]=61
buffer[1]=62
buffer[2]=d
buffer[3]=a
buffer[4]=63
buffer[5]=64
buffer[6]=d
buffer[7]=a
MainEnd
使用r方式打開文件,讀取文本文件,然后調(diào)用fread函數(shù)讀取文件,
#includestdio.h
intmain()
//使用"rb"讀取二進(jìn)制方式打開文件
FILE*p=fopen("D:\\a.txt","r");
//用于接收讀取數(shù)據(jù)的緩沖區(qū)
charbuffer[1024]={0};
//buffer:將文件讀取到內(nèi)存的位置
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 22184-2025谷物和豆類散存糧食溫度測定指南
- 湖南省衡陽市常寧市2025-2026學(xué)年七年級上學(xué)期期末質(zhì)量監(jiān)測道德與法治試卷(含答案)
- 安徽省蚌埠市固鎮(zhèn)縣部分學(xué)校2025-2026學(xué)年九年級上學(xué)期1月期末數(shù)學(xué)試題答案
- 2025-2026學(xué)年山東煙臺長島第二實驗學(xué)校 九年級(上下冊)期末道德與法治試卷(無答案)
- 五年級數(shù)學(xué)期末考試卷及答案
- 為民服務(wù)題庫及答案
- 網(wǎng)絡(luò)的題目及答案
- 初中數(shù)學(xué)培訓(xùn)
- 北京警察學(xué)院《Photoshop 圖像處理》2024 - 2025 學(xué)年第一學(xué)期期末試卷
- 2022~2023安全員考試題庫及答案第254期
- 特種工安全崗前培訓(xùn)課件
- 2026屆福建省三明市第一中學(xué)高三上學(xué)期12月月考?xì)v史試題(含答案)
- (正式版)DB51∕T 3342-2025 《爐灶用合成液體燃料經(jīng)營管理規(guī)范》
- 2026北京海淀初三上學(xué)期期末語文試卷和答案
- 2025學(xué)年度人教PEP五年級英語上冊期末模擬考試試卷(含答案含聽力原文)
- 醫(yī)院醫(yī)院醫(yī)院后勤管理
- 2025年岐黃天使中醫(yī)課后試題及答案
- 肺癌術(shù)后呼吸功能鍛煉指導(dǎo)
- 保障供貨協(xié)議書
- 2025年中國糖尿病腎臟病基層管理指南(全文)
- 顱內(nèi)腫瘤切除術(shù)手術(shù)配合
評論
0/150
提交評論