此篇介紹如何對二進制檔做多筆資料的讀取
前言
此篇介紹如何對二進制檔做多筆資料的讀取,另外,若想要知道做寫入,可以參考「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);
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝