解决!非常感谢你们所有人。我的日子已经完成了!(早上好,早上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点)
答案 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);
不保留原始文件的内容。您编写的所有内容都将删除文件的内容。
因此,你应该:
根据“主输入文件”大小,您可能希望缓冲读/写操作。
答案 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
大小的第一部分是什么,我建议你也用它来写文件。