這篇文章給大家聊聊關(guān)于fread函數(shù)c語(yǔ)言,以及fread返回值的含義對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站哦。
include和fread函數(shù)區(qū)別
include和fread是C語(yǔ)言中的兩個(gè)不同函數(shù),它們有以下區(qū)別:
功能:include是預(yù)處理指令,用于將一個(gè)頭文件的內(nèi)容包含到當(dāng)前源文件中。而fread是標(biāo)準(zhǔn)庫(kù)函數(shù),用于從指定的文件中讀取數(shù)據(jù)。
語(yǔ)法:include指令的語(yǔ)法為#include<stdio.h>,它不需要參數(shù)。而fread函數(shù)的語(yǔ)法為size_tfread(void*ptr,size_tsize,size_tcount,FILE*stream),它需要指定讀取數(shù)據(jù)的緩沖區(qū)、數(shù)據(jù)塊大小、數(shù)據(jù)塊數(shù)量和文件指針作為參數(shù)。
文件操作:include指令只是將頭文件的內(nèi)容復(fù)制到當(dāng)前源文件中,不涉及文件操作。而fread函數(shù)通過(guò)指定的文件指針進(jìn)行實(shí)際的文件讀取操作。
作用域:include指令作用于整個(gè)源文件,將頭文件的內(nèi)容直接插入到源文件中。而fread函數(shù)只影響其所在函數(shù)的作用域。
可移植性:include指令是C語(yǔ)言的標(biāo)準(zhǔn)化特性,在不同的編譯器和平臺(tái)上都得到支持。而fread函數(shù)依賴于標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn),在不同的平臺(tái)和編譯器上可能有所差異。
綜上所述,include指令用于包含頭文件,不涉及實(shí)際的文件操作,而fread函數(shù)用于從文件中讀取數(shù)據(jù),具有更具體的文件操作功能。
C語(yǔ)言中出現(xiàn)Unhandled exception
1、你把文件流指針關(guān)閉了,就不能再次使用了,除非你用fopen打開(kāi)2、建議你將malloc與free成對(duì)使用3、C語(yǔ)言存在fread函數(shù),不需要你自己去封裝函數(shù)我愚鈍,改不了你的代碼,提一點(diǎn)個(gè)人觀點(diǎn)
1.40 C語(yǔ)言,讀取二進(jìn)制文件的函數(shù)調(diào)用形式為fread(buffer,size,count,fp)
buffer是用來(lái)存放讀取出來(lái)的數(shù)據(jù)的緩沖區(qū)size是每次讀取得大小cout是多少個(gè)size,也就是說(shuō)實(shí)際讀取的字節(jié)數(shù)是size*cout個(gè)fp是文件指針,你指定文件名打開(kāi)文件時(shí)得到的一個(gè)文件指針你查看函數(shù)手冊(cè),有英文描述吧,仔細(xì)看看,習(xí)慣了就懂了怎么獲取信息
c語(yǔ)言fseek函數(shù)的用法
關(guān)于c語(yǔ)言fseek函數(shù)的用法:
c語(yǔ)言fseek函數(shù)的作用是:從一個(gè)文件流中讀數(shù)據(jù),最多讀取count個(gè)元素,每個(gè)元素size字節(jié),如果調(diào)用成功返回實(shí)際讀取到的元素個(gè)數(shù),如果不成功或讀到文件末尾返回0。下面我們來(lái)看看c語(yǔ)言fread函數(shù)的用法。
fread()函數(shù)----Readsdatafromastream.
#include
size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);
從一個(gè)文件流中讀數(shù)據(jù),讀取count個(gè)元素,每個(gè)元素size字節(jié).如果調(diào)用成功返回count.如果調(diào)用成功則實(shí)際讀取size*count字節(jié)。
C語(yǔ)言讀取文件中的數(shù)據(jù)
讀寫(xiě)文件在編程里面應(yīng)該是用的最多也最基礎(chǔ)的工作了。但是,C語(yǔ)言中,文件讀寫(xiě)方法有很多種,各種方法的使用場(chǎng)景區(qū)別甚大,到底日常工作中,我們什么時(shí)候該用哪種方法呢?還是說(shuō)隨便抓一種用就可以?
這里就給大家分享一下C語(yǔ)言文件的各種方法:
在window環(huán)境下,文件分別兩種,一種為文本文件(用記事本可以打開(kāi)的文件,如txt、xml、html、js等),一種為二進(jìn)制文件(如圖片、軟件、壓縮包等)
讀寫(xiě)文本文件
首先創(chuàng)建一個(gè)File對(duì)象,這個(gè)利用到系統(tǒng)庫(kù)中的fopen()函數(shù),該函數(shù)返回一個(gè)File*類型的對(duì)象。
FILE*fopen(constchar*filename,constchar*mode);
第一個(gè)參數(shù)為:文件路徑;第二個(gè)參數(shù)為打開(kāi)模式:這個(gè)是固定的,具體是什么意思大家可以自己去查一下,沒(méi)什么特別的,記住就好了。
1、文本文件讀寫(xiě)
接下來(lái)我們讀寫(xiě)一個(gè)文本文件,我新建一個(gè)test.txt文件并且讀取出內(nèi)容寫(xiě)進(jìn)newtest.txt文件中,這里有兩組函數(shù)fgetc/fputc和fgets/fputs函數(shù),故名意意,fgetc是讀取出一個(gè)字符,而fgets是讀取一段字符串,fputc是讀寫(xiě)入一個(gè)字符,fputs寫(xiě)進(jìn)一段字符串。我們分別來(lái)看一下:
intmain(){ FILE*fpr=fopen("test.txt","r"); FILE*fpw=fopen("newtest.txt","w"); if(fpr&&fpw) { while(!feof(fpr)) { charc=(char)fgetc(fpr); cout<<c; fputc(c,fpw); } } fclose(fpr); fclose(fpw); system("pause"); return0;}
注意:
1、feof是判斷是否讀取到文件尾的函數(shù),此處不用EOF來(lái)作為讀寫(xiě)結(jié)束條件是因?yàn)椋汉瘮?shù)如fgetc或getc返回EOF并不一定表示文件結(jié)束,當(dāng)讀取文件出錯(cuò)時(shí)也會(huì)返回EOF,僅憑返回-1就認(rèn)為文件結(jié)束是錯(cuò)誤的;正因?yàn)槿绱耍覀冃枰猣eof()來(lái)判斷文件是否結(jié)束,當(dāng)然用feof()來(lái)判斷文件結(jié)束時(shí)也需要判斷讀取操作是否出錯(cuò),這時(shí)可以用ferror()來(lái)判斷,當(dāng)其為真時(shí)表示有錯(cuò)誤發(fā)生。在實(shí)際的程序中,應(yīng)該每執(zhí)行一次文件操作,就用用ferror函數(shù)檢測(cè)是否出錯(cuò)。
2、fgetc()返回的是int,如果要在屏幕上打印出字符的話需要轉(zhuǎn)換為char;
上面是一個(gè)字符一個(gè)字符的讀,下面一段一段的讀:
FILE*fpr=fopen("test.txt","r");FILE*fpw=fopen("newtest.txt","w");if(fpr&&fpw){ while(!feof(fpr)) { char*buff=newchar[1024]; char*s=fgets(buff,3,fpr); cout<<s; fputs(s,fpw); }}fclose(fpr);fclose(fpw);
這個(gè)方法個(gè)人不是很推薦,因?yàn)樵谑褂眠^(guò)程中經(jīng)常會(huì)報(bào)錯(cuò),這里我如果將以此讀取的字符串長(zhǎng)度由3改為2或者1就會(huì)報(bào)錯(cuò),這個(gè)我也搞不清為什么,如果有知道的朋友可以評(píng)論幫我解答一下;
讀寫(xiě)二進(jìn)制文件
C語(yǔ)言讀寫(xiě)二進(jìn)制文件通過(guò)庫(kù)函數(shù)fread和fwrite實(shí)現(xiàn):
size_tfread(void*buff,size_tsizeofElement,size_tcount,FILE*stream);
size_tfwrite(constvoid*ptr,size_tsizeofElement,size_tcount,FILE*stream);
參數(shù)解釋:buff:緩存區(qū)地址
sizeofElement:每次讀/寫(xiě)的數(shù)據(jù)大小
count:要多去多個(gè)個(gè)sizeofElement大小的數(shù)據(jù)
stream:文件指針
現(xiàn)在我們來(lái)讀一張神仙姐姐的圖片test.ipg并且將讀取到的內(nèi)容寫(xiě)進(jìn)newtest.jpg,然后查看是否能打開(kāi)。
intmain(){FILE*fpr=fopen("test.jpg","rb");FILE*fpw=fopen("newtest.jpg","wb");char*buff=newchar[50];intlen=50;while(len==50){len=fread(buff,sizeof(char),50,fpr);fwrite(buff,sizeof(char),len,fpw);}fclose(fpr);fclose(fpw);system("pause");return0;}
運(yùn)行結(jié)果,打開(kāi)newtest.jpg,結(jié)果完美呈現(xiàn)神仙姐姐。
注意以下幾點(diǎn):
1、文件打開(kāi)方式,不管是讀還是寫(xiě)都需要在后面加b,b就是binary二進(jìn)制的意思,所以這里打開(kāi)方式是“日本”和“wb”;
2、寫(xiě)入fwrite中的count一定要注意,你的緩存區(qū)存了多大的內(nèi)容這里就寫(xiě)多大的內(nèi)容,不然會(huì)導(dǎo)致文件損壞,因?yàn)槲叶ǖ氖敲看巫x取50個(gè)char大小的內(nèi)容,但是文件大小不可能是50的整數(shù)啊,最后一次讀取的話他肯定會(huì)小于50,并且大小不能超過(guò)緩存區(qū)的大小;
文件內(nèi)部位置指針
在打開(kāi)任何文件的時(shí)候,都會(huì)有一個(gè)文件內(nèi)部位置指針。為什么要在這里介紹這個(gè)呢?我們大部分讀取文件的時(shí)候都是不用去管他的,因?yàn)槲覀兓竞苌儆凶x取固定位置開(kāi)始固定長(zhǎng)度的需求,都是從開(kāi)始一直讀取到文件結(jié)束。
其實(shí)我們上面用到的那么多函數(shù),位置指針在文件被打開(kāi)的時(shí)候位置指針是在零為,每讀取一次這個(gè)指針就會(huì)往后面移動(dòng)你讀取的數(shù)據(jù)兩個(gè)距離。
這里有三個(gè)函數(shù):
1、intfseek(FILE*stream,longintoffset,intwhere)這個(gè)函數(shù)的作用是將文件位置指針從指定位置(where:系統(tǒng)有定義三個(gè)宏SEEK_SET:文件頭、SEEK_CUR當(dāng)前指針位置、SEEK_END文件尾,當(dāng)然你也可以自己指定位置,比如100、50這樣)移動(dòng)個(gè)offset個(gè)位置(正數(shù)往后移,負(fù)數(shù)往前移);
2、voidrewind(FILE*stream)這個(gè)很簡(jiǎn)單,將位置指針指向文件開(kāi)頭;
3、longintftell(FILE*stream)這個(gè)也很簡(jiǎn)答,告訴你當(dāng)前位置指針的位置(相對(duì)于文件頭);
這可以干嘛呢?最實(shí)用的,當(dāng)然是快速的獲取文件長(zhǎng)度啊:
我們只需要用fseek將指針移動(dòng)到文件尾,再用ftell求出當(dāng)前指針位置就是了:
fseek(fpr,OL,SEEK_END);注意這里的offset一定要給0
ftell(fpr);
fread判斷文件里的數(shù)組長(zhǎng)度
使用fread函數(shù)讀取文件中的數(shù)組長(zhǎng)度,可以通過(guò)以下步驟實(shí)現(xiàn):
打開(kāi)文件并獲取文件指針。
使用fread函數(shù)讀取文件中的數(shù)據(jù)到一個(gè)緩沖區(qū)。
使用ftell函數(shù)獲取文件指針的當(dāng)前位置,即已讀取的字節(jié)數(shù)。
使用sizeof操作符獲取數(shù)組元素的大小。
將已讀取的字節(jié)數(shù)除以數(shù)組元素的大小,即可得到數(shù)組的長(zhǎng)度。
注意,fread函數(shù)讀取的是二進(jìn)制數(shù)據(jù),因此需要根據(jù)實(shí)際情況解析數(shù)據(jù)內(nèi)容。
文件中的數(shù)據(jù)必須按照特定格式進(jìn)行存儲(chǔ)和讀取,以確保正確獲取數(shù)組長(zhǎng)度。
關(guān)于fread函數(shù)c語(yǔ)言到此分享完畢,希望能幫助到您。