Использование 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-интерфейсы.
Могу ли я извлекать, хранить и записывать файл побитно, чтобы не было расхождений между входным и выходным файлами? Спасибо за вашу помощь, это очень ценится.
Не уверен, почему 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<<
для форматированных данных, Кроме при использовании, как указано выше.
В самых основных терминах:
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
читать и писать куски одновременно.