[C/C++] 多筆資料 二進制檔案 讀取-使用fread

此篇介紹如何對二進制檔做多筆資料的讀取

前言

 


 

此篇介紹如何對二進制檔做多筆資料的讀取,另外,若想要知道做寫入,可以參考「C/C++多筆資料的二進制檔案寫入-使用fwrite

 

使用fread

 


 

首先,先讓我們來看看二進制的檔案寫入所提供的函式吧,參考C++ Reference,如下圖:

 

fread的函式參數,其實要填入的參數與fwrite一致,它的第一個參數是你所要讀取到的變數記憶體位置(也可以是陣列或結構),第二個參數是此變數的資料型態bytes大小,第三個參數是一次讀取的筆數(假若是5,就代表寫入5筆),最後是你所使用的FILE檔案指標。

那麼以下讓我們來要如何做多筆資料的讀取呢?也是和前一篇fwrite一樣也是透過尋訪方式一筆一筆讀取,如下:

 

尋訪讀取

product_t p_list[10];//宣告
int count = 7;//假設7筆

for(i=0 ; i < count ; i++){
 //讀取目前尋訪的資料,大小為結構的byte大小,讀取一筆
 fread(&p_list[i], sizeof(product_t), 1, pf); 
}

 

另一種方式,則事先讀取儲存在檔案的資料筆數,再依照檔案的筆數一次完成全部的讀取,如下:

一次讀取

product_t p_list[10];//宣告
int count;//假設7筆

//先讀取寫入目前的筆數,確保讀檔可以先知道之前檔案的筆數
fread(&count,sizeof(int),1,pf); 

//參數一是陣列的記憶體位置,寫入的btyes大小為目前結構的大小,一次讀取count筆
fread(p_list,sizeof(product_t),count,pf); 

 

 

程式碼

 


以下是範例程式碼

1.尋訪讀取

#define MAX_SIZE 100

typedef struct{
   int num;
   char name[MAX_SIZE];
   double price;
}product_t;


//main 宣告
product_t p_list[10];
int i,count;
char filename[MAX_SIZE];
FILE *pf;

////////////////////////////////////////

//讀取部分-尋訪方式
scanf("%s",filename); 
pf = fopen(filename,"wb+"); 

if(!pf){
   printf("open file error!\n");
   return 0;
}



for(i=0 ; i < count ; i++){

 //讀取並寫入目前尋訪的資料,大小為結構的byte大小為,讀取一筆
 fread(&p_list[i], sizeof(product_t), 1, pf); 

}

fclose(pf);

2.一次讀取並寫入

#define MAX_SIZE 100

typedef struct{
   int num;
   char name[MAX_SIZE];
   double price;
}product_t;


//main 宣告
product_t p_list[10];
int i,count;
FILE *pf;


////////////////////////////////////////

//讀取部分-一次全部讀取

char filename[MAX_SIZE];
scanf("%s",filename); 
pf = fopen(filename,"wb+"); 
if(!pf){
   printf("open file error!\n");
   return 0;
}

//先讀取目前的筆數,確保讀檔可以先知道之前檔案的筆數
fread(&count,sizeof(int),1,pf); 

//參數一是陣列的記憶體位置,寫入的btyes大小為目前結構的大小,一次讀取count筆
fread(p_list,sizeof(product_t),count,pf); 

fclose(pf);
 

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝