Распределение памяти под файл на самом деле довольно плохой способ сделать это, особенно то, как это делается здесь. Если malloc () завершается ошибкой, данные не записываются в выходной файл (и это происходит молча). Другими словами, вы не можете копировать файлы размером более нескольких гигабайт на 32-битной платформе из-за ограничений адресного пространства.
На самом деле гораздо лучше использовать меньший фрагмент памяти (выделенный или в стеке) и читать / записывать файл в виде фрагментов. Чтение и запись в любом случае будут буферизованы, и, пока вы делаете куски относительно большими, накладные расходы на вызовы функций для библиотек времени выполнения C минимальны.
Вы также должны всегда копировать файлы в двоичном режиме, это быстрее, так как нет шансов на перевод.
Что-то вроде:
FILE *fin = fopen ("infile","rb"); // make sure you check these for NULL return
FILE *fout = fopen ("outfile","wb");
char buff[1000000]; // or malloc/check-null if you don't have much stack space.
while ((count = fread (buff, 1, sizeof(buff), fin)) > 0) {
// Check count == -1 and errno here.
fwrite (buff, 1, count, fout); // and check return value.
}
fclose (fout);
fclose (fin);
Это из памяти, но дает общее представление о том, как это сделать. И вы должны всегда иметь проверку ошибок копирования.