2016-12-14 50 views
1

我想將二進制文件加載到char數組中。我的代碼:讀取300MB的二進制文件到char數組

int MAX_FILE_SIZE = 1 000 000 
FILE *f; 
char buffer[MAX_FILE_SIZE]; 
f = fopen("sample.bin", "rb"); //sample.bin is 300MB binary file 
if (f) 
    n = fread(buffer, sizeof(char), MAX_FILE_SIZE, f); 

它的工作,直到我設置MAX_FILE_SIZE比1M還有更大的,因爲我收到program.exe has stopped working。如果我想把所有sample.bin加載到內存中,我應該將MAX_FILE_SIZE設置爲〜300M。我怎樣才能做到這一點?

+4

這不是一個可測試的例子,但我懷疑你用完stackspace的。 – EOF

+5

使用一些堆分配的內存(例如'malloc')。 –

+0

你有沒有試過讓你的緩衝區'靜態'?這將分配數據段中的空間而不是堆棧 –

回答

4

有一種可以定義與分隔符的數字塊大批沒有C語法:int MAX_FILE_SIZE = 1 000 000應寫int MAX_FILE_SIZE = 1000000;

將大數組分配爲具有自動存儲的本地對象可能會導致未定義的行爲。可用的總空間取決於系統,但可能小於1兆字節。我建議你malloc()分配緩衝區並在使用後釋放它:

size_t MAX_FILE_SIZE = 300000000; // 300MB 

int read_file(void) { 
    FILE *f; 
    int n = -1; 
    char *buffer = malloc(MAX_FILE_SIZE); 
    if (buffer == NULL) 
     return -1; 
    f = fopen("sample.bin", "rb"); //sample.bin is 300MB binary file 
    if (f) { 
     n = fread(buffer, sizeof(char), MAX_FILE_SIZE, f); 
     // perform what ever task you want 
     fclose(f); 
    } 
    free(buffer); 
    return n; 
} 
2

根據您的平臺和編譯器,在堆棧上允許的分配(這是緩衝區所在的位置)上設置了一些限制。如果你想把整個文件加載到內存中,你將不得不使用堆(使用malloc)。因此,而不是:

char buffer[MAX_FILE_SIZE]; 

使用:

char *buffer; 
if ((buffer = malloc(sizeof(char) * MAX_FILE_SIZE)) == 0) { 
    // exit or some other action to take as your OS failed to allocate 
} 
+0

這個確切的代碼無法正常工作,因爲如果條件不滿足,'buffer'將立即超出範圍。 – HolyBlackCat

+0

好的。謝謝。 –