Найти строку идентификатора, скопировать байты с использованием 00 заполненной последовательности и сохранить ее в файл

Ну, я пытаюсь извлечь некоторые файлы, которые находятся в двоичном файле, мой метод на данный момент состоит в том, чтобы найти 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];» Но я понятия не имею, как это исправить …
Кто-нибудь может мне помочь?

~ Я надеюсь, вы поняли мою проблему, мой английский очень плохой ~

0

Решение

Следующий фрагмент сомнителен:

   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, Другими словами указатель DATA а также указатель memblock указать на то же место.

Ваш код удаляет память, которая DATA указывает на. Не очень хорошая вещь. Смотрите также «утечка памяти». Это неопределенное поведение. Другой процесс может записать данные, которые были удалены, или память может быть повторно использована другими выделениями в вашей программе. В любом случае вы не можете ожидать, что данные будут действительными после того, как они были удалены.

1

Другие решения


По вопросам рекламы [email protected]