/* A different solution would read f1 into a dynamically allocated array, then write the array to f2. This solution is simpler and works for files that don't fit into memory. */ #include #include #include void die_usage(void) { fprintf(stderr,"usage: copy f1 f2\n"); exit(100); } void die_read(char *fn) { fprintf(stderr,"copy: fatal: unable to read %s: %s\n",fn,strerror(errno)); exit(111); } void die_write(char *fn) { fprintf(stderr,"copy: fatal: unable to write %s: %s\n",fn,strerror(errno)); exit(111); } int main(int argc,char **argv) { FILE *f1; FILE *f2; char c; if (argc < 3) die_usage(); f1 = fopen(argv[1],"r"); if (!f1) die_read(argv[1]); f2 = fopen(argv[2],"w"); if (!f2) die_write(argv[2]); while (fscanf(f1,"%c",&c) == 1) if (fprintf(f2,"%c",c) == -1) die_write(argv[2]); if (ferror(f1)) die_read(argv[1]); if (fflush(f2) == -1) die_write(argv[2]); exit(0); }