Cópia byte-a-byte de um arquivo

[Enunciado]

// Arquivo copiaarquivo.c
// ----------------------
// Este programa faz uma cópia do arquivo dado pelo usuário.
// A operação de cópia usa as funções getc e putc. O programa
// é uma cópia do copyfile.c de E. Roberts (The Art and
// Science of C).
/////////////////////////////////////////////////////////////


// Seção 1: Protótipos de funções
/////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

void  CopiaArquivo (FILE *arqEntrada, FILE *arqSaida);
FILE *AbreArquivo (string prompt, string modo);


// Seção 2: Tipos-de-dados
//////////////////////////

typedef char *string;


// Seção 3: Programa principal
//////////////////////////////

int main (void)
{
   printf ("Este programa faz uma cópia do arquivo dado.\n");
   FILE *arqEntrada, *arqSaida;
   arqEntrada = AbreArquivo ("Arquivo velho: ", "r");
   arqSaida = AbreArquivo ("Arquivo novo: ", "w");
   CopiaArquivo (arqEntrada, arqSaida);
   fclose (arqEntrada);
   fclose (arqSaida);
   return EXIT_SUCCESS;
}


// Função CopiaArquivo
// Uso típico: CopiaArquivo (arqEntrada, arqSaida);
// -----------------------------------------------
// Esta função copia o conteúdo de arqEntrada para arqSaida.
// O usuário deve abrir os arquivos antes de chamar esta 
// função e deve fechá-los depois.

void CopiaArquivo (FILE *arqEntrada, FILE *arqSaida)
{
   int ch;
   while ((ch = getc (arqEntrada)) != EOF)
       putc (ch, arqSaida);
}


// Função AbreArquivo
// Uso típico: arq = AbreArquivo (prompt, modo);
// --------------------------------------------
// Esta função pede o nome de um arquivo ao usuário. O pedido
// consiste na string prompt. Em seguida, a função tenta abrir
// o arquivo no modo especificado pelo usuário (por exemplo, 
// "w"). Se tiver sucesso, a função devolve um ponteiro para o
// arquivo aberto. Caso contrário, volta a pedir o nome de um
// arquivo ao usuário.

FILE *AbreArquivo (string prompt, string modo)
{
   string nomeDoArq;
   FILE *resultado;
   while (true) {
       printf ("%s", prompt); // fputs (prompt, stdout)
       nomeDoArq = readLine (stdin);
       resultado = fopen (nomeDoArq, modo);
       if (resultado != NULL) break;
       printf ("Não posso abrir o arquivo %s\n", nomeDoArq);
   }
   return resultado;
}