【linux--菜鳥學習之路】fread和fwrite
fread
函式名: fread 功 能: 從一個流中讀資料 用 法: int fread(void *ptr, int size, int nitems, FILE *stream); 參 數:用於接收資料的地址(ptr) 單個元素的大小(size) 元素個數(nitems) 提供資料的檔案指標(stream) 返回值:成功讀取的元素個數
fwrite函式
1.函式功能
用來讀寫一個數據塊。
2.一般呼叫形式
fwrite(buffer,size,count,fp);
3.說明
(1)buffer:是一個指標,對fread來說,它是讀入資料的存放地址。對fwrite來說,是要輸出資料的地址。
(2)size:要讀寫的位元組數;
(3)count:要進行讀寫多少個size位元組的資料項;
(4)fp:檔案型指標
個人理解 -流:相當於 size 的大小(不一定對);如果定義size=128,那麼這個資料流的大小就是128為基本單位;
#include "stdio.h" //#include "unistd.h" int main(int argc, char *argv[]) { FILE *src_fp , *des_fp;//定義指向原始檔和目標檔案的指標 int read_ret; char read_buf[128]={0}; //char buf[]="hello linux"; if(argc<3) { printf("src ? des? \n "); return -1; } src_fp=fopen(argv[1],"r"); if(src_fp==NULL) { printf("open src %s fail\n",argv[1]); return -2; } des_fp=fopen(argv[2],"w"); if(des_fp==NULL) { printf("open des %s fail\n",argv[2]); return -3; } while(1) //重點在這裡 { read_ret=fread(read_buf,1,128,src_fp); //定義了128個位元組大小的檔案流 printf("read_ret=%d ",read_ret);
fwrite(read_buf,1,read_ret,des_fp); //寫到目標檔案中 if(read_ret < 128) { printf("read file %s end \n",argv[1]); break; } // printf("begin write\n"); // fwrite(read_buf,1,read_ret,des_fp); } fclose(src_fp); fclose(des_fp); return 0; }
執行後將a.c內容複製到b.c,結果如下:
接下來將程式碼修改:
while(1) //重點在這裡 { read_ret=fread(read_buf,1,128,src_fp); //定義了128個位元組大小的檔案流 printf("read_ret=%d ",read_ret);
// fwrite(read_buf,1,read_ret,des_fp); //寫到目標檔案中 if(read_ret < 128) { printf("read file %s end \n",argv[1]); break; } printf("begin write\n"); fwrite(read_buf,1,read_ret,des_fp); //將寫操作,修改到這裡 }
執行結果如下:
如果覺得不想看 ,可以看下面的:
可以看出,a.c和b.c的內容不一樣,具體原因是:
這裡的最後一個71,這裡因為小於128,所以沒有寫入到b.c裡去;b.c比a.c正好小455-384=71;
(這也是我認為size就是流的大小,因為read_ret返回實際讀到的大小,也就是他是按照這個size的大小來一次性讀寫的)