c++ - 将一个文件分割成多个文件

标签 c++ c

我有一个包含数百万条记录的大文件 (16 GB)。每条记录都有一个 20 字节的结构。

现在,我需要将此文件拆分为几个临时的新文件(每个文件大约 100 Mb),同时保持此结构完整(不要在中间切割 20 个字节)。

计算新文件大小的最佳算法是什么?

最佳答案

如果每条记录始终为 20 字节,则 100 MB (100 * 1024 * 1024) 文件中正好可以容纳 5242880 条记录。

因此,如何执行此操作应该非常明显,只要您始终一次读取和写入 20 个字节的倍数,就不会有损坏记录的风险。由于您所需的 100 MB 切片大小是其倍数,因此请使用它。如果您在桌面级 PC 或其他设备上执行此操作,100 MB 的 I/O 缓冲区相当大,但还不算极端。

所以,你要做这样的事情:

bool chunkify(const char *filename, size_t chunkSize)
{
  void *buffer = malloc(chunkSize);
  FILE *in;
  bool ok = true;

  if (buffer == NULL)
    return false;

  if ((fin = fopen(filename, "rb")) != NULL)
  {
    size_t got;
    unsigned int count = 0;

    while(ok && (got = fread(buffer, 1, chunkSize, fin)) > 0)
    {
      FILE *fout;
      char outname[1024];
      snprintf(outname, sizeof outname, "%s-%u", filename, count++);
      if ((fout = fopen(outname, "wb")) != NULL)
      {
        ok &= fwrite(buffer, got, 1, fout);
        fclose(fout);
      }
    }
    fclose(fin);
  }
  free(buffer);
  return ok;
}

注意:以上是未经测试的半复杂 I/O 代码,仅作为起点。它可能会有错误等待您发现。

关于c++ - 将一个文件分割成多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378085/

相关文章:

c++ - 大集合的第 n 个或任意组合

c - 段错误和信号量无法正常工作

C - Strtok() ,将字符串拆分为 '\n' 但保留分隔符

c++ - std::map <std::any,std::any>麻烦

c++ - 加载位图文件 (.bmp)

c++ - 为什么 semop() 挂起?

在C中创建图像内核释放内存错误

c - 在不退出 C 函数的情况下从函数返回一个值

c - C 中的 NCURSES 标准输入

c++ - 我应该在 Assert 失败后返回吗?