1) Io inserirei un controllo su argc per verificare se siano stati passati DUE parametri da linea di comando

2) Perché usi un buffer se poi leggi e scrivi un carattere alla volta?

3) Aumenta la dimensione del buffer a 4096, elimina i due cicli while e sostituiscili con questo

codice:
while ((dim = fread(buffer, sizeof(char), sizeof(buffer), fs)) > 0) 
    { 
      fwrite(buffer, sizeof(char), dim, fs2); 
    }
Così dovrebbe funzionare (meglio).