C ++用另一个编辑二进制文件

时间:2013-06-28 08:09:09

标签: c++ file binary hex edit

解决!非常感谢你们所有人。我的日子已经完成了!(早上好,早上4点)

我正在尝试用C ++编写一个用二进制打开.dat文件的程序,用前一个.dat文件替换前1840个十六进制字符,同时保留第一个.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点)

2 个答案:

答案 0 :(得分:3)

修改

您可以使用以下内容修改文件

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,读取剩余数据并将其写入输出文件。

根据“主输入文件”大小,您可能希望缓冲读/写操作。

答案 1 :(得分:1)

我首选的解决方法,虽然Matthieu Rouget的解决方案确实有效,但只需将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大小的第一部分是什么,我建议你也用它来写文件。