2017-02-10 4 views
1

Я пытаюсь прочитать в .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"); 
} 

ответ

3

Вы открыть входной файл в двоичном режиме, но в этом коде

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

вы открыть выходной файл без двоичная Режим. И нет причин для разговора по отдельности:

std::ofstream myfile(argLocation, std::ios::out | std::ios::binary | std::ios::trunc); 
Смежные вопросы