Tout d'abord, le code que vous avez écrit n'est pas portable, même si vous le faites fonctionner. Pourquoi utiliser des fonctions spécifiques au système d'exploitation alors qu'il existe une manière parfaitement indépendante de la plate-forme de le faire ? Voici une version qui n'utilise qu'un seul fichier d'en-tête et qui est portable sur toute plate-forme qui implémente la bibliothèque standard 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;
}
EDIT :la référence glibc a ceci à dire :
En général, vous devriez vous en tenir à l'utilisation de flux plutôt que de descripteurs de fichiers, à moins qu'il y ait une opération spécifique que vous voulez faire qui ne peut être faite que sur un descripteur de fichier. Si vous êtes un programmeur débutant et que vous n'êtes pas sûr des fonctions à utiliser, nous vous suggérons de vous concentrer sur les fonctions d'entrée formatées (voir Entrée formatée) et les fonctions de sortie formatées (voir Sortie formatée).
Si vous êtes préoccupé par la portabilité de vos programmes vers des systèmes autres que GNU, vous devez également savoir que les descripteurs de fichiers ne sont pas aussi portables que les flux. Vous pouvez vous attendre à ce que tout système exécutant ISO C supporte les flux, mais les systèmes non-GNU peuvent ne pas supporter du tout les descripteurs de fichiers, ou peuvent seulement implémenter un sous-ensemble des fonctions GNU qui opèrent sur les descripteurs de fichiers. Cependant, la plupart des fonctions de descripteur de fichier de la bibliothèque GNU sont incluses dans la norme POSIX.1.
Vous devez écrire() les données read() dans le nouveau fichier :
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);
Mise à jour :ajout des ouvertures appropriées...
Au fait, le O_CREAT peut être OU (O_CREAT | O_WRONLY). Vous ouvrez en fait trop de descripteurs de fichiers. Ne faites l'ouverture qu'une seule fois.
Vous devez faire write
dans la même boucle que read
.