Pertama-tama, kode yang Anda tulis tidak portabel, bahkan jika Anda membuatnya berfungsi. Mengapa menggunakan fungsi khusus OS ketika ada cara sempurna yang tidak tergantung platform untuk melakukannya? Ini adalah versi yang hanya menggunakan satu file header dan portabel untuk semua platform yang mengimplementasikan library standar 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:Referensi glibc mengatakan ini:
Secara umum, Anda harus tetap menggunakan stream daripada deskriptor file, kecuali ada beberapa operasi tertentu yang ingin Anda lakukan yang hanya dapat dilakukan pada deskriptor file. Jika Anda seorang pemrogram pemula dan tidak yakin fungsi apa yang digunakan, kami sarankan Anda berkonsentrasi pada fungsi input terformat (lihat Input Terformat) dan fungsi output terformat (lihat Output Terformat).
Jika Anda khawatir tentang portabilitas program Anda ke sistem selain GNU, Anda juga harus menyadari bahwa deskriptor file tidak seportabel aliran. Anda dapat mengharapkan sistem apa pun yang menjalankan ISO C untuk mendukung aliran, tetapi sistem non-GNU mungkin tidak mendukung deskriptor file sama sekali, atau mungkin hanya mengimplementasikan subset dari fungsi GNU yang beroperasi pada deskriptor file. Namun, sebagian besar fungsi deskriptor file di pustaka GNU disertakan dalam standar POSIX.1.
Anda perlu menulis() data read() ke dalam file baru:
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);
Perbarui:menambahkan bukaan yang tepat...
Btw, O_CREAT bisa OR'd (O_CREAT | O_WRONLY). Anda sebenarnya membuka terlalu banyak pegangan file. Buka sekali saja.
Anda harus melakukan write
dalam loop yang sama dengan read
.