在 C 中存储和解包一个非常长的整数数组

Storing and unpacking a very long array of ints in C

我有一个非常长的整数数组 (3,000,000+),我想存储它们并能够快速解压。起初,我将每个 int 写在一个文本文件中的单独一行中,但是由于必须将字符串转换回 int,因此解压缩花费了相当长的时间。然后,有人建议我只将数组本身写入文件,但是当我读回它并打印出元素时,它只打印零。代码看起来像这样:

#include <stdio.h>
#include <stdlib.h>

#define LENGTH 3000000

int main() {
    FILE *f = fopen("file.txt", "w");
    int *arr = malloc(LENGTH * sizeof(int));

    /* initialization of arr not shown */

    fwrite(arr, sizeof(int), LENGTH, f);
    fclose(f);
    free(arr);
    return 0;
}

然后解压数据:

#include <stdio.h>
#include <stdlib.h>

#define LENGTH 3000000

int main() {
    FILE *f = fopen("file.txt", "r");
    int *arr = malloc(LENGTH * sizeof(int));
    fread(arr, sizeof(int), LENGTH, f);
    fclose(f);

    for (int i = 0; i < LENGTH; ++i) {
        printf("%d\n", arr[i]);
    }

    free(arr);
    return 0;
}

但是,正如我所说,它只打印零。为什么这不起作用,有没有更合适的方法来做这样的事情?

几件事:

  1. 直接读写int时,也必须以b模式打开文件:

     // Open for writing
     FILE *fp = fopen("myfile.bin", "wb");
    
    
     // Open for reading:
     FILE *fp = fopen("myfile.bin", "rb");
    
  2. 调用 malloc 时,您应该 始终 检查 return 值是否不是 NULL 以确保分配成功。分配 3000000 * sizeof(int) 字节时,不检查是否成功是一场等待发生的灾难。您还应该检查 fopenfreadfwrite:

    的 return 值
     // Checking malloc for success
     arr = malloc(LENGTH * sizeof(int));
     if(NULL == arr)
     {
          perror("malloc");
          exit(EXIT_FAILURE);
     }
    
     // Checking fopen for success:
     FILE *fp = fopen("file.bin", "rb");
     if(NULL == fp)
     {
         perror("fopen");
         exit(EXIT_FAILURE);
     }
    
     // Checking fread for success:
     size_t readCnt = fread(arr, sizeof(int), LENGTH, fp); 
     if(readCnt != LENGTH)
     {
         // Did not read file successfully
     }
    
     // Checking fwrite for success:
     size_t writtenCnt = fwrite(arr, sizeof(int), LENGTH, fp);
     if(writtenCnt != LENGTH)
     {
         // Did not write file successfully
     }