#include #include #include #include #include /* file copy in C - binary version. copies argv[1] to argv[2] */ #define BUFSIZE 1024 int main(int argc, char* argv[]) { int infd, outfd; // file descriptors int n = BUFSIZE; // number of bytes actually read each time unsigned char /*byte*/ buffer[BUFSIZE]; if (argc != 3) { perror("wrong number of arguments\n"); exit(1); } infd = open(argv[1],O_RDONLY,0); outfd = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0755); // 0755 is file permission, as used by chmod while (n>0) { n = read(infd,buffer,BUFSIZE); // reads UP TO BUFSIZE bytes if (n>0) write(outfd,buffer,n); } close(infd); close(outfd); exit(0); } /* copy program in c using streams - not recommended for beginners*/ int main2(int argc, char *argv[]) { char b; // character buffer int infd, outfd; // file descriptors int result = EOF + 1; // something not EOF FILE *infile; FILE *outfile; infile = fopen(*++argv,"r"); outfile = fopen(*++argv,"w"); while (!(result == EOF)) { result = fscanf(infile,"%c",&b); // copy char by char // need to use gets if (!(result == EOF)) fprintf(outfile,"%c",(char)b); } /* version using fgets - better be good with C strings! char buffer[BUFSIZE]; char *rs; // returned by fgets, which will be null on EOF rs = buffer; // so it's not null initially while (rs != NULL) { rs = fgets(buffer,BUFSIZE,infile); buffer[BUFSIZE-1] = 0; // extra safety - make sure string terminated if (rs) fprintf(outfile,"%s",buffer); } */ fclose(infile); fclose(outfile); exit(0); } //main