C語言文件操作之fread函數(shù)詳解_第1頁
C語言文件操作之fread函數(shù)詳解_第2頁
C語言文件操作之fread函數(shù)詳解_第3頁
C語言文件操作之fread函數(shù)詳解_第4頁
C語言文件操作之fread函數(shù)詳解_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論