En primer lugar, el código que escribió no es portátil, incluso si lo hace funcionar. ¿Por qué utilizar funciones específicas del sistema operativo cuando existe una forma de hacerlo perfectamente independiente de la plataforma? Aquí hay una versión que usa un solo archivo de encabezado y es portátil para cualquier plataforma que implemente la biblioteca estándar de 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;
}
EDITAR:La referencia de glibc dice esto:
En general, debe ceñirse al uso de secuencias en lugar de descriptores de archivo, a menos que desee realizar alguna operación específica que solo pueda realizarse en un descriptor de archivo. Si es un programador principiante y no está seguro de qué funciones usar, le sugerimos que se concentre en las funciones de entrada con formato (consulte Entrada con formato) y las funciones de salida con formato (consulte Salida con formato).
Si le preocupa la portabilidad de sus programas a sistemas que no sean GNU, también debe tener en cuenta que los descriptores de archivos no son tan portátiles como los flujos. Puede esperar que cualquier sistema que ejecute ISO C admita secuencias, pero es posible que los sistemas que no sean GNU no admitan descriptores de archivos en absoluto, o que solo implementen un subconjunto de las funciones GNU que operan en los descriptores de archivos. Sin embargo, la mayoría de las funciones de descriptor de archivos en la biblioteca GNU están incluidas en el estándar POSIX.1.
Debe escribir () los datos leídos () en el nuevo archivo:
ssize_t nrd;
int fd;
int fd1;
fd = open(aa[1], O_RDONLY);
fd1 = open(aa[2], O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
while (nrd = read(fd,buffer,50)) {
write(fd1,buffer,nrd);
}
close(fd);
close(fd1);
Actualización:se agregaron las aperturas adecuadas...
Por cierto, el O_CREAT puede ser OR'd (O_CREAT | O_WRONLY). En realidad, está abriendo demasiados identificadores de archivos. Solo haz la apertura una vez.
Tienes que hacer write
en el mismo ciclo que read
.