将原始内存写入文件

时间:2014-03-20 10:34:21

标签: c++ c file malloc dump

我正在尝试将内存(使用malloc制作)转储到文件中。我想转储原始数据,因为我不知道在我要转储内存的时候内存中的内容(int float double)。 最好的方法是什么? 我已经尝试了一些东西但是没有按照我的意愿工作。

4 个答案:

答案 0 :(得分:4)

在C中,它非常微不足道,真的:

const size_t size = 4711;
void *data = malloc(size);
if(data != NULL)
{
  FILE *out = fopen("memory.bin", "wb");
  if(out != NULL)
  {
    size_t to_go = size;
    while(to_go > 0)
    {
      const size_t wrote = fwrite(data, to_go, 1, out);
      if(wrote == 0)
        break;
      to_go -= wrote;
    }
    fclose(out);
  }
  free(data);
}

上述尝试正确地循环fwrite()来处理短写,这是大多数复杂性来自的地方。

答案 1 :(得分:3)

目前尚不清楚“不工作”是什么意思。

您可以将reinterpret_cast内存发送到char *并轻松将其写入文件。 再读回来是另一回事。

答案 2 :(得分:2)

这样做的“C ++方式”可能涉及在二进制模式下使用std::ostream::write和流。

#include <fstream>
#include <string>

bool write_file_binary (std::string const & filename, 
  char const * data, size_t const bytes)
{
  std::ofstream b_stream(filename.c_str(), 
    std::fstream::out | std::fstream::binary);
  if (b_stream)
  {
    b_stream.write(data, bytes);
    return (b_stream.good());
  }
  return false;
}


int main (void)
{
  double * buffer = new double[100];
  write_file_binary("test.bin", 
    reinterpret_cast<char const *>(buffer), 
    sizeof(double)*100);
  delete[] buffer;
  return 0;
}

答案 3 :(得分:0)

如果这是C ++,则在序列化和反序列化过程中可能会为您提供帮助, 我将原始内存数组写入文件(使用new []本质上是相同的 作为C世界中的malloc):

https://github.com/goblinhack/simple-c-plus-plus-serializer

    #include "hexdump.h"

    auto elems = 128;

    static void serialize (std::ofstream out)
    {
        auto a = new char[elems];
        for (auto i = 0; i > bits(a);

        hexdump(a, elems);
    }

输出:

    128 bytes:
    0000 00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f |................|
    0010 10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f |................|
    0020 20 21 22 23 24 25 26 27  28 29 2a 2b 2c 2d 2e 2f | !"#$%&'()*+,-./|
    0030 30 31 32 33 34 35 36 37  38 39 3a 3b 3c 3d 3e 3f |0123456789:;?|
    0040 40 41 42 43 44 45 46 47  48 49 4a 4b 4c 4d 4e 4f |@ABCDEFGHIJKLMNO|
    0050 50 51 52 53 54 55 56 57  58 59 5a 5b 5c 5d 5e 5f |PQRSTUVWXYZ[\]^_|
    0060 60 61 62 63 64 65 66 67  68 69 6a 6b 6c 6d 6e 6f |`abcdefghijklmno|
    0070 70 71 72 73 74 75 76 77  78 79 7a 7b 7c 7d 7e 7f |pqrstuvwxyz{|}~.|