读取带有 ifstream 的二进制文件

Reading Binary Files w/ ifstream

本文关键字:二进制文件 ifstream 读取      更新时间:2023-10-16

我正在尝试阅读.exe并将其写回去。我的代码适用于.txt文件,但由于某种原因它破坏了可执行文件。我做错了什么?我不确定是我读错了还是写错了。

#include <string>
#include <vector>
#include <iostream>
#include <filesystem>
#include <unordered_set>
#include <Windows.h>
unsigned char *ReadFileAsBytes(std::string filepath, DWORD &buffer_len)
{
    std::ifstream ifs(filepath, std::ofstream::binary | std::ifstream::ate);
    if (!ifs.is_open())
    {
        return(nullptr);
    }
    // Go To End
    ifs.seekg(0, ifs.end);
    // Get Position (Size)
    buffer_len = static_cast<DWORD>(ifs.tellg());
    // Go To Beginning
    ifs.seekg(0, ifs.beg);
    // Allocate New Char Buffer The Size Of File
    PBYTE buffer = new BYTE[buffer_len];
    ifs.read(reinterpret_cast<char*>(buffer), buffer_len);
    ifs.close();
    return buffer;
}
void WriteToFile(std::string argLocation, unsigned char *argContents, int argSize)
{
    std::ofstream myfile;
    myfile.open(argLocation);
    myfile.write((const char *)argContents, argSize);
    myfile.close();
}
int main()
{
    // Config
    static std::string szLocation   = "C:\Users\Admin\Desktop\putty.exe";
    static std::string szOutLoc     = "C:\Users\Admin\Desktop\putty2.exe";
    DWORD dwLen;
    unsigned char *szBytesIn = ReadFileAsBytes(szLocation, dwLen);
    std::cout << "Read In " << dwLen << " Bytes" << std::endl;
    // Write To File
    WriteToFile(szOutLoc, szBytesIn, dwLen);
    system("pause");
}

以二进制模式打开输入文件,但在此代码中

std::ofstream myfile;
myfile.open(argLocation);

打开输出文件而不使用二进制模式。并且没有理由单独调用打开:

std::ofstream myfile( argLocation, std::ios::out | std::ios::binary | std::ios::trunc);