Почему я не могу скопировать такие исполняемые файлы?

Использование C ++ <fstream>довольно легко скопировать текстовый файл:

#include <fstream>

int main() {
std::ifstream file("file.txt");
std::ofstream new_file("new_file.txt");

std::string contents;
// Store file contents in string:
std::getline(file, contents);
new_file << contents; // Write contents to file

return 0;
}

Но когда вы делаете то же самое для исполняемого файла, выходной исполняемый файл фактически не работает. Может быть, std :: string не поддерживает кодировку?

Я надеялся, что смогу сделать что-то вроде следующего, но объект file является указателем, и я не могу разыменовать его (при запуске следующего кода создается new_file.exe, который на самом деле просто содержит адрес памяти чего-либо):

std::ifstream file("file.exe");
std::ofstream new_file("new_file.exe");

new_file << file;

Я хотел бы знать, как это сделать, потому что я думаю, что это было бы важно в приложении для обмена файлами в локальной сети. Я уверен, что есть API-интерфейсы более высокого уровня для отправки файлов с сокетами, но я хочу знать, как на самом деле работают такие API-интерфейсы.

Могу ли я извлекать, хранить и записывать файл побитно, чтобы не было расхождений между входным и выходным файлами? Спасибо за вашу помощь, это очень ценится.

1

Решение

Не уверен, почему ildjarn сделал это комментарием, но чтобы сделать это ответом (если он отправит ответ, я удалю это). В основном вам нужно использовать неотформатированная чтение и письмо. getline форматирует данные.

int main()
{
std::ifstream in("file.exe", std::ios::binary);
std::ofstream out("new_file.exe", std::ios::binary);

out << in.rdbuf();
}

Технически, operator<< для форматированных данных, Кроме при использовании, как указано выше.

6

Другие решения

В самых основных терминах:

using namespace std;

int main() {
ifstream file("file.txt", ios::in | ios::binary );
ofstream new_file("new_file.txt", ios::out | ios::binary);

char c;
while( file.get(c) ) new_file.put(c);

return 0;
}

Хотя, вам лучше создать буфер и использовать ifstream::read / ofstream::write читать и писать куски одновременно.

2

По вопросам рекламы [email protected]