[Volta]
/* Arquivo copiaarquivo.c
// ----------------------
// Este programa faz uma cópia de um arquivo dado pelo usuário.
// A operação de cópia usa as funções getc/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>
void CopieArquivo (FILE *arqEntrada, FILE *arqSaida);
FILE *AbraArquivo (string prompt, string mode);
/* Seção 2: Tipos de dados
/////////////////////// */
typedef char *string;
typedef enum {FALSE, TRUE} bool;
/* Seção 3: Programa principal
/////////////////////////// */
int main (void)
{
FILE *arqEntrada, *arqSaida;
printf ("Este progrma faz uma cópia de um arquivo dado.\n");
arqEntrada = AbraArquivo ("Arquivo velho: ", "r");
arqSaida = AbraArquivo ("Arquivo novo: ", "w");
CopieArquivo (arqEntrada, arqSaida);
fclose (arqEntrada);
fclose (arqSaida);
return EXIT_SUCCESS;
}
/* Função CopieArquivo
// Uso típico: CopieArquivo (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 CopieArquivo (FILE *arqEntrada, FILE *arqSaida)
{
int ch;
while ((ch = getc (arqEntrada)) != EOF)
putc (ch, arqSaida);
}
/* Função AbraArquivo
// Uso típico: arq = AbraArquivo (prompt, modo);
// --------------------------------------------
// Esta função pede o nome de um arquivo ao usuário. O pedido
// consiste na string propmt. 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 *AbraArquivo (string prompt, string modo)
{
string nomeDoArq;
FILE *resultado;
while (TRUE) {
printf ("%s", prompt);
nomeDoArq = getLine ();
resultado = fopen (nomeDoArq, modo);
if (resultado != NULL) break;
printf ("Não posso abrir o arquivo \"%s\"\n", nomeDoArq);
}
return resultado;
}