2016-12-14 28 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

好的。谢谢。 –