我正在尝试逐字节复制exe文件。我比较了2的十六进制文件,它们非常不同。似乎有些值没有加载到中
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(){
ifstream fin("file.exe", ifstream::binary);
vector<char> buffer(1, 0);
ofstream newfile;
newfile.open("newfile.exe", ios::binary);
while (fin.read(buffer.data(), buffer.size())){
streamsize s = fin.gcount();
for (int i = 0; i < buffer.size(); i++){
if (buffer[i] != EOF){
newfile << buffer[i];
cout << buffer[i] << endl;
} else {
break;
}
}
}
}
为什么用单个char
读取和写入矢量?s
的目的是什么?为什么要尝试将EOF
与IOStreams进行比较?这段代码似乎是C和C++的奇怪混合,结果完全被破坏了!
以下是我的做法:
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
int main()
{
std::ifstream fin ("file.exe", std::ios::binary);
std::ofstream fout("newfile.exe", std::ios::binary);
std::copy(
std::istream_iterator<char>(fin),
std::istream_iterator<char>(),
std::ostream_iterator<char>(fout)
);
}
甚至只是:
#include <iostream>
#include <fstream>
int main()
{
std::ifstream fin ("file.exe", std::ios::binary);
std::ofstream fout("newfile.exe", std::ios::binary);
fout << fin.rdbuf();
}
没有混乱,没有大惊小怪!
在一般情况下,这对流非常有效,但是,如果你只想执行一个字节对字节的文件复制,你应该让你的操作系统为你做这件事。它可以做得比你快得多!例如,Windows上的CopyFile
。
感谢您的帮助。这就是我完成这项工作的原因。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream is("file.exe", ios::binary);
ofstream fs("newfile.exe", ios::binary);
if (is) {
is.seekg(0, is.end);
int length = is.tellg();
is.seekg(0, is.beg);
char * buffer = new char[length];
is.read(buffer, length);
is.close();
for (int i = 0; i < length; i++) {
fs << buffer[i];
}
delete[] buffer;
}
}