2013-06-28 2 views
1

Решенный! спасибо всем вам. Мой день был сделан! (Ну утром, его 4 часа ночи)C++ редактировать двоичный файл с другим

Я пытаюсь написать программу на C++, которая открывает файл .dat в двоичном формате и заменяет первые 1840 шестнадцатеричных символов на другой файл .dat, оставляя остальные шестнадцатеричные значения первого .dat-файла одинаковым. Сегодня я провел около 12 часов, и у меня был небольшой успех. Я начинающий программист, я потратил один семестр на курсы C++, и мы не попали в потоки.

(он открывает файл и все, но удаляет все, что после того, как новые значения были добавлены)

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
#include <cmath> 
#include <cstring> 
using namespace std; 



int main(){ 

string filename; 
long size; 
char* memblock; 

    cout << " Enter a file to be modded by Mod.dat "; 
    cin >> filename; 

    ofstream infile (filename ,std::ofstream::binary); 
    //filename: the file that will be opened and changed) 

    ifstream modFile ("Mod.dat", ifstream::binary); 
    // (mod.dat is the file that i get the first 1840 hex values from) 




modFile.seekg (0,modFile.end); 
size = modFile.tellg(); 
memblock = new char [size]; 
modFile.seekg (0, ios::beg); 
    modFile.read (memblock, size); 

infile.write(memblock, 1840); 

modFile.close(); 
infile.close(); 


cout << endl; 
return 0; 
} 

Любая помощь будет принята с благодарностью, я надеюсь, что есть некоторые простой способ сделать это.

Решенный! спасибо всем вам. Мой день было сделано (ну утром, его 4 утра)

+0

Я предлагаю вам удалить [] ваш memblock где-нибудь – doctorlove

ответ

1

Я предпочитаю исправить, хотя исправление Матье Руже в действительно работает, это просто добавить ofstreeam::in на открытие входного файла:

ofstream infile (filename.c_str(), std::ofstream::binary | ofstream::in); 

(я должен был использовать c_str() в моей сборки, как и Glibc в моей версии не принимает std :: string в качестве ввода).

Я проверил это на своей локальной системе (потребовалось время, чтобы понять, что mod.dat на самом деле «Mod.dat»!)

Это, вероятно, хорошая идея также проверить, что файлы на самом деле открыты, так что-то вроде этого после ofstream infile линии:

if (!infile) 
{ 
cout << "Couldn't open " << filename << endl; 
} 

и аналогичные для modfile линии.

И поскольку вы пытаетесь выяснить, что такое первая часть размера modfile, я бы предложил вам также использовать это для написания файла.

+0

Решенный! спасибо всем вам. Мой день был сделан! – user2530952

3

Edit:

Вы можете modidy файл вместо что-то вроде:

std::fstream s(my_file_path, std::ios_base::binary); 
s.seekp(position_of_data_to_overwrite, std::ios_base::beg); 
s.write(my_data, size_of_data_to_overwrite); 

std::fstream не укоротить ваш входной файл как std::ofstream.


Другое решение - не использовать тот же файл для чтения и записи. Используйте три файла:

  • Один для выходного файла.
  • Один для первого входного файла.
  • Один для второго входного файла.

fstream infile (filename ,std::ofstream::binary); не сохраняет содержимое исходного файла. Все, что вы пишете, стирает содержимое файла.

Таким образом, вы должны:

  • открыть выходной файл
  • открыть файл «Mod», прочитать первые 1840 байт из первого файла, записать их в выходной файл.
  • открыть файл «основного входного файла», переместить курсор на 1840, прочитать оставшиеся данные и записать их в выходной файл.

В зависимости от размера «основного входного файла» вы можете захотеть буферизовать операцию чтения/записи.

+0

Хорошо, я попробую это быстро ... – user2530952

+2

На самом деле вы можете использовать fstream ("example.bin", ios :: in | ios :: out | ios :: app | ios :: binary) использовать один и тот же файл для чтения и записи –

+0

Решенный! спасибо всем вам. Мой день был сделан! – user2530952

Смежные вопросы