查找 id 字符串,复制字节 util 00 填充序列并将其保存到文件中

Find id string, copy bytes util 00 filled sequence and save it to a file

好吧,我正在尝试提取二进制文件中的一些文件,目前我的方法是找到标识文件开头的 idString,复制字节直到找到 00 序列,然后将此结果保存在单独的文件中。

这是我当前的代码

#include <iostream>
#include <fstream>

using namespace std;


int writeFile(char * array, string name){
    std::ofstream fs(name.c_str(), std::ios::out | std::ios::binary | std::ios::app);
    fs.write(array, sizeof(array));
    fs.close();
}


int main () {
  streampos size;
  char * memblock;
  char * DATA;
  char * NEW_FILE;

  ifstream file ("DATA.BIN", ios::in|ios::binary|ios::ate);
 if (file.is_open())
 {
   size = file.tellg();
   memblock = new char [size];
   file.seekg (0, ios::beg);
   file.read (memblock, size);
   file.close();

DATA = memblock;
delete[] memblock;

int i = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;


string temp = "";
string t = "";
string temp1 = "";

    for(i=0;i<300843008;i++){
        temp = temp + DATA[i];
        a = a + 1;
        if(b == 0){
        if(a == 4){
            if(temp == "RIFF"){
                b = 1;
                NEW_FILE[0] = 'R';
                NEW_FILE[1] = 'I';
                NEW_FILE[2] = 'F';
                NEW_FILE[3] = 'F';
            }
            a = 0;
            temp == "";
        }
    }

        if(b == 1){
            NEW_FILE[i] = DATA[i];
            if(DATA[i] == 00){
                c = c + 1;
                if(c == 32){
                    temp1 = "file" + c;
                    writeFile(NEW_FILE,temp1);
                    b = 0;
                    c = 0;
                }
            }

        }

    }

 }
else cout << "error";
return 0;
}

我的问题是程序一打开就关闭,显然它在运行这一行时崩溃了"temp = temp + DATA [i];"但我不知道如何修复它... 谁能帮帮我?

~希望你能理解我的问题,我的英文很烂~

以下片段有问题:

   size = file.tellg();
   memblock = new char [size];  // <-- Allocation
   file.seekg (0, ios::beg);
   file.read (memblock, size);
   file.close();

   DATA = memblock;             // <-- Assign 2nd pointer to *same memory*
   delete[] memblock;           // <-- Delete memory pointed to by same pointers.

尤其是最后两行。

你分配内存:

   memblock = new char [size];

然后再分配另一个指针指向同一个内存

   DATA = memblock;

然后删除内存:

   delete[] memblock;

赋值操作:DATA = memblock 不复制内存。该操作使 DATA 点指向与 memblock 相同的位置。也就是说pointerDATApointermemblock指向同一个地方

您的代码删除了 DATA 指向的内存。不是什么好事。另见 "memory leak"。这是未定义的行为。另一个进程可能会写入已删除的数据,或者内存可能会被程序中的其他分配重新使用。无论哪种情况,您都不能指望数据在删除后仍然有效。