23 fread和fwrite的讀寫緩衝區

2022-09-06 21:00:20 字數 2609 閱讀 7057

fwrite(buff, sizeof(buff), 1, pfile);//返回實際寫入的完整項數,引數3盡量填1,簡單粗暴

fread(buff, sizeof(buff), 1, pfile);//返回實際讀取的完整項數,引數3盡量填1,簡單粗暴

檔案內容:

每4位元組複製舊檔案到新檔案,忽略錯誤檢查:

file *pfilesource = fopen("c++ primer.exe", "rb");//createfile

file *pfiledest = fopen("c++ primer2.exe", "wb");

char buffsource[16] = ;//設定很小的緩衝區,便於測試

char buffdest[16] = ;

setvbuf(pfilesource, buffsource, _iofbf, 7);//只給7位元組,便於測試

setvbuf(pfiledest, buffdest, _iofbf, 7);

fseek(pfilesource, 0, seek_end);

long filesize = ftell(pfilesource);

rewind(pfilesource);

unsigned int buff = 0;

for (long i = 0; i < filesize / 4; i++)

unsigned char byte = '\0';

for (long i = 0; i < filesize % 4; i++)

fflush(pfiledest);//writefile

fclose(pfilesource);//closehandle

fclose(pfiledest);

以上**將緩衝區大小設為7,但是實際向下捨入到 2的整數倍

,即6位元組。

第1次fread讀取6位元組填滿緩衝區,再取出4位元組給**中的unsigned int buff = 0;此變數在0019ff0c處。

f10單步,第1次

fwrite寫入4

位元組到寫緩衝區,

watch

切換到pfiledest

觀察。再觀察要寫入的檔案,發現大小沒寫入任何資料,因為寫緩衝區沒滿。

f10單步,第2次

fread讀取6

位元組

f10單步,第2次

fwrite

,0506

寫入緩衝區末尾,這時滿了,將整個

6位元組緩衝區寫入檔案。再調整

_ptr

到_base

,並把0708

寫入緩衝區。開啟檔案,發現有

6位元組資料。

f10單步,第3次

fread

,緩衝區資料足夠,未讀入新資料,有變化的是

f10單步,第3次

fwrite

,剛好填滿寫緩衝區,開啟檔案發現依舊是

6位元組,未寫入。

f10單步,第4次

fread

,讀入6

位元組新資料

f10單步,第4次

fwrite

,緩衝區已滿,呼叫

fflush

,開啟檔案發現多了6位元組

總結:第一次fread和

fwrite

時會分別提供預設

4096

位元組的讀和寫緩衝區,也可以自己呼叫setvbuf函式設定緩衝區。fread從檔案讀取

_bufsiz

大小的資料存放在讀緩衝區,後續如無必要,不會讀檔案,而是直接讀緩衝區。同理,

fwrite

將資料寫入寫緩衝區,除非緩衝區已滿,否則不寫入檔案。兩者都通過移動指標

_ptr

讀取緩衝區和寫入緩衝區。

fread函式和fwrite函式

1.函式功能 用來讀寫乙個資料塊。2.一般呼叫形式 fread buffer,size,count,fp fwrite buffer,size,count,fp 3.說明 1 buffer 是乙個指標,對fread來說,它是讀入資料的存放位址。對fwrite來說,是要輸出資料的位址。2 size 要...

fread函式和fwrite函式

1.函式功能 用來讀寫乙個資料塊。2.一般呼叫形式 fread buffer,size,count,fp fwrite buffer,size,count,fp 3.說明 1 buffer 是乙個指標,對fread來說,它是讀入資料的存放位址。對fwrite來說,是要輸出資料的位址。2 size 要...

fread 和 fwrite用法小結

fwrite和fread是以記錄為單位的i o函式,fread和fwrite函式一般用於二進位制檔案的輸入輸出。cpp view plain copy print?include size t fread void ptr,size t size,size t nmemb,file stream s...