2014-01-31 102 views
0

所以basicaly我已經二進制文件,這樣的結構製成讀二進制文件CS

struct data{ 
char name[30]; 
char name2[30]; 
}; 

我想讀取數據回從文件結構的數組,但問題是我不知道有多少記錄有這文件。有人可以解釋我怎麼能讀整個文件沒有給記錄裏面的記錄?

回答

4

您可以打開該文件,檢查它的大小:

fseek(fp, 0L, SEEK_END); // Go at the end 
sz = ftell(fp);   // Tell me the current position 
fseek(fp, 0L, SEEK_SET); // Go back at the beginning 

,記錄的數量內將是:

N = sz/sizeof(struct data); 

總之,要小心,如果你只寫一個結構數組到一個文件,由於不同的內存對齊,有可能它不會被其他機器讀取。您可以使用__attribute__((packed))選項來確保結構相同(但是它是GCC特定的擴展,而不是標準C的一部分)。

struct __attribute__((packed)) data { 
    char name[30]; 
    char name2[30]; 
}; 
0

內存映射您的文件是最好的選擇。

int fd = open(filename, O_RDONLY); 
struct stat fdstat; 
fstat(fd, &fdstat); 
struct data * file_contents = mmap(NULL, fdstat.st_size 
    , PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); 

// assuming the file contains only those structs 
size_t num_records = fdstat.st_size/sizeof(*file_contents); 

然後智能操作系統會首先從文件中加載數據,並將從內存中逐出最近未被訪問的頁面。