Prima di tutto, il codice che hai scritto non è portabile, anche se riesci a farlo funzionare. Perché utilizzare funzioni specifiche del sistema operativo quando esiste un modo perfettamente indipendente dalla piattaforma per farlo? Ecco una versione che utilizza solo un singolo file di intestazione ed è portabile su qualsiasi piattaforma che implementa la libreria 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:Il riferimento a glibc ha questo da dire:
In generale, dovresti continuare a usare gli stream piuttosto che i descrittori di file, a meno che non ci sia qualche operazione specifica che vuoi fare che può essere eseguita solo su un descrittore di file. Se sei un programmatore alle prime armi e non sei sicuro di quali funzioni usare, ti suggeriamo di concentrarti su le funzioni di input formattato (vedi Input formattato) e le funzioni di output formattato (vedi Output formattato).
Se sei preoccupato per la portabilità dei tuoi programmi su sistemi diversi da GNU, dovresti anche essere consapevole che i descrittori di file non sono portabili come gli stream. Puoi aspettarti che qualsiasi sistema che esegue ISO C supporti i flussi, ma i sistemi non GNU potrebbero non supportare affatto i descrittori di file o potrebbero implementare solo un sottoinsieme delle funzioni GNU che operano sui descrittori di file. Tuttavia, la maggior parte delle funzioni dei descrittori di file nella libreria GNU sono incluse nello standard POSIX.1.
Devi scrivere() i dati read() nel nuovo file:
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);
Aggiornamento:aggiunte le aperture corrette...
A proposito, O_CREAT può essere OR'd (O_CREAT | O_WRONLY). In realtà stai aprendo troppi handle di file. Basta aprire una volta.
Devi fare write
nello stesso ciclo di read
.