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

前言


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

實作方式


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

fread的函式參數,其實要填入的參數與fread一致,它的第一個參數是你所要讀取到的變數記憶體位置(也可以是陣列或結構),第二個參數是此變數的資料型態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); 

程式碼


尋訪

#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); 

}

//參數一是陣列的記憶體位置,寫入的btyes大小為結構的大小,一次讀取count筆

fread(p_list,sizeof(product_t),count,pf); 

fclose(pf);

一次讀取並寫入

#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);
Para obtener más información sobre las optimizaciones del compilador, consulte el aviso sobre la optimización.