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;
}