2009-11-30 45 views
2

如何以更好的方式告訴多少條記錄中有一個二進制文件之前,我打開文件和讀取記錄到例如數組?如何嗅出的二進制文件中的記錄數讀入在C編程語言中數組過嗎?

MyFile = fopen("DATA.dat", "rb"); 
i = 0; 
while (feof(MyFile) == 0) { 
    fread(&tempReadingRecord,sizeof(tempReadingRecord), 1, file); 
    if (feof(MyFile) == 0 { 
    i++; 
    } 
    } 
fclose(MyFile); 
} 
printf("%d", i); /* does work to find out how many records but optimal? */ 

回答

6

鑑於你顯然處理的固定大小的記錄整個文件,你可以尋求到文件的末尾,獲取當前位置,並記錄大小差距。從理論上講,這有移植性問題(二進制文件可以包含附加到其最終完全無效的任意數字),但在實踐中,你不會遇到的最常見的系統(據我所知的問題,這主要發生在CP/M ,它沒有明確地存儲文件長度,只是一些塊,所以文件的末尾總是被填充以填充最後一個塊)。

順便說一句,你的循環讀取記錄有一個問題 - 事實上,幾乎任何類型的循環while (!feof(file)),或任何類似的事實上保證工作不正確(通常它會「讀取」最後一個記錄兩次)。

+1

+1 FEOF。您應該使用read中的返回值。 – 2009-11-30 21:07:47

2

它們是什麼樣的記錄?

如果它們是固定長度的,採取的文件大小,並且由記錄的大小除以它。

4

如果您正在處理的整個文件只包含固定大小的記錄(這似乎是這種情況),您可以使用stat來獲取文件的總大小。 stat從文件系統本身獲取此信息,因此,您不需要提前打開文件。在我的Linux機器上,這個程序的確有竅門:


int main() { 

    const char * const filename = "/bin/ls"; 

    struct stat buf; 

    if (0 == stat(filename, &buf)) { 
     printf("File: %s - Size: %d\n", filename, buf.st_size); 
    } 

    return 0; 

} 

上面的程序打印了二進制ls的總大小。一旦你有文件的總大小,你所需要做的就是將它除以表示記錄的結構的大小。這會給你文件中的記錄總數。

0

如果它們的尺寸是固定的,那就和傑瑞的解決方案一起,否則,以你自己的方式閱讀電子書是我能想到的唯一方法。順便說一句,是否會出現這樣一種情況,您將不會根據對象的數量來讀取文件?

相關問題