Прежде всего, написанный вами код не переносим, даже если вы заставите его работать. Зачем использовать специфичные для ОС функции, когда существует совершенно независимый от платформы способ сделать это? Вот версия, которая использует только один заголовочный файл и переносима на любую платформу, которая реализует стандартную библиотеку C.
#include <stdio.h>
int main(int argc, char **argv)
{
FILE* sourceFile;
FILE* destFile;
char buf[50];
int numBytes;
if(argc!=3)
{
printf("Usage: fcopy source destination\n");
return 1;
}
sourceFile = fopen(argv[1], "rb");
destFile = fopen(argv[2], "wb");
if(sourceFile==NULL)
{
printf("Could not open source file\n");
return 2;
}
if(destFile==NULL)
{
printf("Could not open destination file\n");
return 3;
}
while(numBytes=fread(buf, 1, 50, sourceFile))
{
fwrite(buf, 1, numBytes, destFile);
}
fclose(sourceFile);
fclose(destFile);
return 0;
}
РЕДАКТИРОВАТЬ: ссылка glibc имеет это сказать:
В общем, стоит придерживаться
используя потоки, а не файл
дескрипторы, если есть некоторые
конкретная операция, которую вы хотите сделать это
может быть сделано только на дескриптор файла.
Если вы начинающий программист и
не уверены, какие функции использовать, мы
предлагаю сосредоточиться на
отформатированные функции ввода (см.
Форматированный ввод) и форматированный вывод
функции (см. Форматированный вывод).
Если вы обеспокоены переносимостью
ваших программ для систем, отличных от
GNU, вы также должны знать, что
дескрипторы файлов не так переносимы
как потоки. Вы можете ожидать любую систему
запуск ISO C для поддержки потоков, но
не-GNU системы могут не поддерживать файл
дескрипторы вообще или могут только
реализовать подмножество GNU
функции, которые работают с файлом
дескрипторы. Большая часть файла
функции дескриптора в GNU
библиотеки включены в POSIX.1
стандарт, однако.