Как написано, ваш src
экземпляр является обычным fstream, и вы не указываете открытый режим для ввода. Простое решение - сделать src
экземпляром ifstream
, и ваш код работает. (Просто добавив один байт!)
Если бы вы проверили входной поток (как предлагает sbi), вы бы обнаружили, что он не был открыт правильно, поэтому ваш целевой файл имел нулевой размер. Он был открыт в режиме записи (так как это был ofstream
) с параметром усечения, чтобы сделать его нулевым, но запись результата rdbuf()
просто не удалась, ничего не написано.
Еще одна вещь, на которую следует обратить внимание, это то, что, хотя она отлично работает для небольших файлов, она будет очень неэффективна для больших файлов. Таким образом, вы читаете все содержимое исходного файла в память, а затем снова записываете его в один большой блок. Это тратит впустую много памяти. Вам лучше читать чанками (скажем, 1 МБ, например, разумный размер для дискового кэша) и записывать чанк за раз, причем последний является оставшимся размером. Чтобы определить размер источника, вы можете искать до конца и запрашивать смещение файла, тогда вы знаете, сколько байтов вы обрабатываете.
И вы, вероятно, обнаружите, что ваша ОС еще более эффективна при копировании файлов, если вы используете нативный API, но тогда она станет менее переносимой. Возможно, вы захотите взглянуть на модуль файловой системы Boost для портативного решения.