生活随笔
收集整理的這篇文章主要介紹了
Fread 和fwrite的参数不同,返回值不同
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
函數(shù)fwrite
功能
??C語言函數(shù),向文件寫入一個(gè)數(shù)據(jù)塊??。
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:這個(gè)函數(shù)以二進(jìn)制形式對(duì)文件進(jìn)行操作,不局限于文本文件
返回值:返回實(shí)際寫入的數(shù)據(jù)塊數(shù)目
(1)buffer:是一個(gè)指針,對(duì)fwrite來說,是要輸出數(shù)據(jù)的地址;
(2)size:要寫入內(nèi)容的單字節(jié)數(shù);
(3)count:要進(jìn)行寫入size字節(jié)的數(shù)據(jù)項(xiàng)的個(gè)數(shù);
(4)stream:目標(biāo)文件指針;
(5)返回實(shí)際寫入的數(shù)據(jù)項(xiàng)個(gè)數(shù)count。
剛才編一個(gè)關(guān)于用C庫函數(shù)實(shí)現(xiàn)的文件復(fù)制操作的代碼時(shí)發(fā)生錯(cuò)誤。錯(cuò)誤的根本是想當(dāng)然的以為fread函數(shù)的用法,對(duì)其理解不深刻。后來在網(wǎng)友幫助下才發(fā)現(xiàn)錯(cuò)誤。
其實(shí)函數(shù)的用法可以通過Linux中的man來獲得幫助。
比如fread.在終端鍵入
[cpp] view plaincopyprint?
man?3?fread???
這是會(huì)出現(xiàn)下面的東西:
[cpp] view plaincopyprint?
NAME?????????fread,?fwrite?-?binary?stream?input/output????SYNOPSIS?????????#include?<stdio.h>???????????size_t?fread(void?*ptr,?size_t?size,?size_t?nmemb,?FILE?*stream);???????????size_t?fwrite(const?void?*ptr,?size_t?size,?size_t?nmemb,???????????????????????FILE?*stream);????DESCRIPTION?????????The?function?fread()?reads?nmemb?elements?of?data,?each?size?bytes?long,?from?the?stream?pointed?to?by?stream,?storing?them?at?the?location?given?by?ptr.???????????The??function??fwrite()??writes??nmemb?elements?of?data,?each?size?bytes?long,?to?the?stream?pointed?to?by?stream,?obtaining?them?from?the?location?given?by?????????ptr.???????????For?nonlocking?counterparts,?see?unlocked_stdio(3).????RETURN?VALUE?????????On?success,?fread()?and?fwrite()?return?the?number?of?items?read?or?written.??This?number?equals?the?number?of?bytes?transferred?only?when?size?is?1.??If?an?????????error?occurs,?or?the?end?of?the?file?is?reached,?the?return?value?is?a?short?item?count?(or?zero).???????????fread()?does?not?distinguish?between?end-of-file?and?error,?and?callers?must?use?feof(3)?and?ferror(3)?to?determine?which?occurred.??
重點(diǎn)放在對(duì)返回值。
可以看出,如果調(diào)用成功的話,函數(shù)會(huì)返回讀到的元素個(gè)數(shù)。如果想返回實(shí)際讀取的字節(jié)數(shù)的話只有當(dāng)size=1,也就是第二個(gè)參數(shù)size為1時(shí)。如果發(fā)生讀取錯(cuò)誤的話,或者已經(jīng)到達(dá)文件末尾,返回值是一個(gè)小的元素個(gè)數(shù)值或者是0.下面給出我的代碼,正確實(shí)現(xiàn)文件拷貝的代碼,以此分析。
[cpp] view plaincopyprint?
#include?<stdio.h>????#define?BUFFER_SIZE??1024????int?main(int?argc,?char?*argv[])??{??????FILE?*from_fp,?*to_fp;??????int?bytes_read,?bytes_write;??????char?*ptr;??????char?buffer[BUFFER_SIZE];????????if(argc?!=?3)?????????????{??????????printf("Input?failed!\n");??????????return?1;??????}????????if(?(from_fp?=?fopen(argv[1],"r"))?==?NULL?)??????????{??????????printf("File?is?not?exist\n");??????????return?1;??????}????????????if((to_fp?=?fopen(argv[2],"w+"))?==?NULL)????????????{??????????printf("Open?file?failed!\n");????????????return?1;??????}????????while(bytes_read?=?fread(buffer,?1,?BUFFER_SIZE,?from_fp))????????{??????????if(bytes_read?>?0)?????????????????????{??????????????ptr?=?buffer;??????????????while(bytes_write?=?fwrite(ptr,?1,?bytes_read,?to_fp))????????????????{??????????????????if(bytes_write?==?bytes_read)?????????????????????????????????break;??????????????????else?if(bytes_write?>?0)???????????????????????????{??????????????????????ptr?+=?bytes_write;??????????????????????bytes_read?-=?bytes_write;??????????????????}??????????????}??????????????if(bytes_write?==?0)??????????????????????????????break;??????????}??????}????????????fclose(from_fp);??????fclose(to_fp);????????return?0;??}??
注
意到我的fread和fwrite中的第二個(gè)參數(shù)size都是1,這樣的話我返回值就是實(shí)際讀取到的或?qū)懭氲淖止?jié)數(shù)。剛開始我寫的程序不是這樣的,我是
[cpp] view plaincopyprint?
while(bytes_read?=?fread(buffer,?BUFFER_SIZE,?1,from_fp))??
[cpp] view plaincopyprint?
while(bytes_write?=?fwrite(ptr,?bytes_read,?1,?to_fp))??
這里第三個(gè)參數(shù)為1,換句話說,也就是說要讀取1個(gè)元素(返回值為1),此元素中包含BUFFER_SIZE個(gè)字節(jié),因?yàn)槲业奈募粷M足這個(gè)條件,這樣的元素值不存在。于是返回的值為0,這也是為什么我的文件數(shù)據(jù)沒有復(fù)制到另一個(gè)文件的原因了,因?yàn)楦揪蜎]有執(zhí)行這個(gè)循環(huán)中的代碼。
另外一個(gè)需要注意到的問題是fread函數(shù)不能區(qū)分文件是否結(jié)尾和出錯(cuò)兩種情況。所以必須使用ferror()和feof()函數(shù)來確定到底是哪種情況,所以關(guān)于文件復(fù)制還有下面另一種寫法。代碼如下:
[cpp] view plaincopyprint?
#include?<stdio.h>??#include?<string.h>????#define?BUFFER_SIZE??1024????int?main(int?argc,?char?*argv[])??{??????FILE?*from_fp,?*to_fp;????????????long?file_len?=?0;??????char?buffer[BUFFER_SIZE];????????if(argc?!=?3)?????????????{??????????printf("Input?failed!\n");??????????return?1;??????}????????if(?(from_fp?=?fopen(argv[1],"r"))?==?NULL?)??????????{??????????printf("File?is?not?exist\n");??????????return?1;??????}????????????if((to_fp?=?fopen(argv[2],"w+"))?==?NULL)????????????{??????????printf("Open?file?failed!\n");????????????return?1;??????}????????????fseek(from_fp,?0L,?SEEK_END);?????????????file_len?=?ftell(from_fp);????????????????fseek(from_fp,?0L,?SEEK_SET);???????????????while(!feof(from_fp))?????????????????????{??????????fread(buffer,?BUFFER_SIZE,?1,?from_fp);??????????if(BUFFER_SIZE?>?file_len)?????????????????????????????fwrite(buffer,?file_len,?1,?to_fp);??????????else??????????????????????????????????????????{??????????????fwrite(buffer,?BUFFER_SIZE,?1,?to_fp);??????????????file_len?-=?BUFFER_SIZE;??????????}??????????bzero(buffer,BUFFER_SIZE);????????????}????????fclose(from_fp);??????fclose(to_fp);????????return?0;??}??
這里面多了幾個(gè)函數(shù),其中feof就是用來檢測(cè)文件是否結(jié)尾的函數(shù)。其返回值非0時(shí)表示文件結(jié)束。還有一個(gè)函數(shù)bzero是清零一段緩沖區(qū)的函數(shù),使用需包含頭文件string.h。注意fread和fwrite函數(shù)的書寫就是采用第三個(gè)參數(shù)為1的方式來書寫的了。
總結(jié)
以上是生活随笔為你收集整理的Fread 和fwrite的参数不同,返回值不同的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。