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以上**將緩衝區大小設為7,但是實際向下捨入到 2的整數倍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);
,即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...