C++ 将文件拆分为多个文件

C++ 将文件拆分为多个文件,c++,c,C++,C,我有一个16GB的大文件,有数百万条记录。每个记录有一个20字节的结构 现在,我需要把这个文件分成几个临时的、新的文件,每个文件大约100个MB,同时保持这个结构完整,不要在20个字节中间剪切。< /P> 计算新文件大小的最佳算法是什么?如果每条记录始终为20字节,则在100 MB 100*1024*1024文件中正好可以容纳5242880条记录 因此,如何做到这一点应该是非常明显的,只要您总是一次读取和写入20字节的倍数,就不会有损坏记录的风险。因为您想要的100MB的片大小是这样的倍数,所以

我有一个16GB的大文件,有数百万条记录。每个记录有一个20字节的结构

现在,我需要把这个文件分成几个临时的、新的文件,每个文件大约100个MB,同时保持这个结构完整,不要在20个字节中间剪切。< /P>


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

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

因此,如何做到这一点应该是非常明显的,只要您总是一次读取和写入20字节的倍数,就不会有损坏记录的风险。因为您想要的100MB的片大小是这样的倍数,所以使用它。如果您是在台式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代码,仅作为起点。它可能会有bug供您查找。

最好的算法是算术

20字节记录中最接近100MB的倍数是5242880条记录,实际上正好是100MB


因此,您可以简单地将文件分成100MB的块,然后就可以使用它了。

只需稍微扩展一下:以20字节的块大小编写100MB的文件。但这将花费很长时间,所以可能使用20字节的倍数?在bash术语中-dd if=sourceFile of=destFile bs=20 count=5242880我以16GB为例。最终尺寸将发生变化。我需要所有这些用于外部排序。。要创建块。@AlexK输入的大小无关紧要,如果是20字节,您将执行与16 GB完全相同的操作。@unwind谢谢您的回答@如果你喜欢,亚历克斯克可以随意接受答案视情况而定。你的文件的格式是什么?哪种语言-C或C++?选择一个.systemsplit-b+std::to_string100ul