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

标签 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 已停止工作。如果我认为将所有 sample.bin 加载到内存是正确的,我应该将 MAX_FILE_SIZE 设置为 ~300M。我该怎么做?

最佳答案

没有用于定义带有数字 block 分隔符的大数的 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;
}

关于c - 读取 300MB 二进制文件到 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41150485/

相关文章:

c - 如何在没有核心转储的情况下捕获段错误

c - 从数组中省略 'N' 组元素

javascript - 如何从表单中删除上传项目?

c - sprintf() 的使用以及 gdb 报告程序提前脱离循环?

c - Solaris 或 Linux 是更好的 C GUI 开发环境吗?

c - Realloc 在目录/文件名的递归存储期间咀嚼字符串数组

c - 使用 free() 时堆损坏

c - 如何在C中向后读取文件?

c++ - 从 .dat 文件读取参数到 C++?

java - 重命名后无法删除文件(文件已打开)