Zunächst einmal ist der von Ihnen geschriebene Code nicht portierbar, selbst wenn Sie ihn zum Laufen bringen. Warum betriebssystemspezifische Funktionen verwenden, wenn es eine vollkommen plattformunabhängige Möglichkeit gibt? Hier ist eine Version, die nur eine einzige Header-Datei verwendet und auf jede Plattform portierbar ist, die die C-Standardbibliothek implementiert.
#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:Die Glibc-Referenz hat folgendes zu sagen:
Im Allgemeinen sollten Sie lieber Streams als Dateideskriptoren verwenden, es sei denn, Sie möchten eine bestimmte Operation ausführen, die nur mit einem Dateideskriptor ausgeführt werden kann. Wenn Sie ein Programmieranfänger sind und sich nicht sicher sind, welche Funktionen Sie verwenden sollen, empfehlen wir Ihnen, sich auf diese zu konzentrieren die formatierten Eingabefunktionen (siehe formatierte Eingabe) und formatierte Ausgabefunktionen (siehe formatierte Ausgabe).
Wenn Sie Bedenken hinsichtlich der Portierbarkeit Ihrer Programme auf andere Systeme als GNU haben, sollten Sie sich darüber im Klaren sein, dass Dateideskriptoren nicht so portabel sind wie Streams. Sie können davon ausgehen, dass jedes System, auf dem ISO C läuft, Streams unterstützt, aber Nicht-GNU-Systeme unterstützen möglicherweise überhaupt keine Dateideskriptoren oder implementieren nur eine Teilmenge der GNU-Funktionen, die mit Dateideskriptoren arbeiten. Die meisten Dateideskriptorfunktionen in der GNU-Bibliothek sind jedoch im POSIX.1-Standard enthalten.
Sie müssen die read()-Daten in die neue Datei schreiben():
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);
Update:Korrekte Öffnungen hinzugefügt...
Übrigens kann das O_CREAT ODER-verknüpft werden (O_CREAT | O_WRONLY). Sie öffnen tatsächlich zu viele Dateihandles. Öffnen Sie einfach einmal.
Du musst write
machen in der gleichen Schleife wie read
.