所以basicaly我已經二進制文件,這樣的結構製成讀二進制文件CS
struct data{
char name[30];
char name2[30];
};
我想讀取數據回從文件結構的數組,但問題是我不知道有多少記錄有這文件。有人可以解釋我怎麼能讀整個文件沒有給記錄裏面的記錄?
所以basicaly我已經二進制文件,這樣的結構製成讀二進制文件CS
struct data{
char name[30];
char name2[30];
};
我想讀取數據回從文件結構的數組,但問題是我不知道有多少記錄有這文件。有人可以解釋我怎麼能讀整個文件沒有給記錄裏面的記錄?
您可以打開該文件,檢查它的大小:
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];
};
內存映射您的文件是最好的選擇。
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);
然後智能操作系統會首先從文件中加載數據,並將從內存中逐出最近未被訪問的頁面。