Za prvé, kód, který jste napsali, není přenosný, i když jej zprovozníte. Proč používat funkce specifické pro operační systém, když existuje způsob, jak to udělat dokonale nezávislý na platformě? Zde je verze, která používá pouze jeden soubor záhlaví a je přenosná na jakoukoli platformu, která implementuje standardní knihovnu 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:Odkaz na glibc říká:
Obecně byste se měli držet spíše proudů než deskriptorů souborů, pokud neexistuje nějaká konkrétní operace, kterou chcete provést a kterou lze provést pouze na deskriptoru souboru. Pokud jste začínající programátor a nejste si jisti, jaké funkce použít, doporučujeme, abyste se soustředili na funkce formátovaného vstupu (viz Formátovaný vstup) a formátovaný výstup (viz Formátovaný výstup).
Pokud máte obavy o přenositelnost svých programů na jiné systémy než GNU, měli byste si také uvědomit, že deskriptory souborů nejsou přenosné jako proudy. Můžete očekávat, že jakýkoli systém běžící na ISO C bude podporovat proudy, ale systémy bez GNU nemusí podporovat deskriptory souborů vůbec nebo mohou implementovat pouze podmnožinu funkcí GNU, které fungují na deskriptorech souborů. Většina funkcí filedescriptoru v GNUlibrary je však zahrnuta ve standardu POSIX.1.
Musíte zapsat() data read() do nového souboru:
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);
Aktualizace:přidána správná otevření...
Btw, O_CREAT může být OR'd (O_CREAT | O_WRONLY). Ve skutečnosti otevíráte příliš mnoho popisovačů souborů. Stačí jednou otevřít.
Musíte provést write
ve stejné smyčce jako read
.