读取300MB二进制文件到char数组

时间:2016-12-14 19:19:03

标签: c file

我正在尝试将二进制文件加载到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。我怎么能这样做?

2 个答案:

答案 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;
}

答案 1 :(得分: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
}