Olá pessoal…
Hoje vou mostrar como copiar um arquivo utilizando a linguagem C.
A funcionalidade criada, funciona lendo os dados de um arquivo de origem (linha a linha), enquanto armazena em um arquivo de destino.
A função criada, solicita primeiramente o caminho do arquivo de origem e o de destino.
Depois basta confirmar, será mostrado uma porcentagem da cópia e uma mensagem se foi feita com sucesso a cópia.
Abaixo o fonte desenvolvido:
#include <stdio.h>
#include <stdlib.h>
#define Tamanho_Nome 100
#ifdef WIN32 //se for windows
#define Limpa_Tela system("cls")
#else //senão, ex.: linux
#define Limpa_Tela system("/usr/bin/clear") //limpa tela
#endif
void str_trim(char *trim_origem, char *trim_destino);
void main()
{
//declarando variáveis que serão utilizadas
char conteudo, auxiliar[100], nome_arq_origem[100], nome_arq_destino[100];
int linhas = 0, linha_atual = 0;
FILE *origem, *destino;
Limpa_Tela;
//Arquivo de Origem
printf("Nome do arquivo de Origem:\n> ");
fgets(auxiliar, Tamanho_Nome, stdin);
//Abre o arquivo de origem
str_trim(auxiliar, nome_arq_origem);
origem = fopen(nome_arq_origem, "r");
//Se o conteúdo for nulo
if (origem == NULL)
{
printf("Arquivo de origem nao existe...\n");
exit(EXIT_FAILURE);
}
//Arquivo de Destino
printf("Nome do arquivo de Destino:\n> ");
fgets(nome_arq_destino, Tamanho_Nome, stdin);
//Abre o arquivo de destino
destino = fopen(nome_arq_destino, "w");
//Se não foi possível abrir, retorna erro
if (destino == NULL)
{
fclose(origem);
printf("Não foi possível gerar o arquivo destino...\n");
exit(EXIT_FAILURE);
}
//Enquanto tiver conteudo na origem, aumenta o número de linhas
while ((conteudo = fgetc(origem)) != EOF) {
linhas++;
}
//Voltando o arquivo ao topo
rewind(origem);
//Enquanto tiver conteudo na origem, inputa esse conteudo no arquivo destino
while ((conteudo = fgetc(origem)) != EOF) {
fputc(conteudo, destino);
//Mostra a porcentagem da cópia
Limpa_Tela;
linha_atual++;
printf("Copiando %d%\n", (linha_atual * 100 / linhas));
}
//Mostrando mensagem de término
printf("\nArquivo copiado com sucesso\n\n");
//Fechando os ponteiros da origem e destino
fclose(origem);
fclose(destino);
}
//Retira os espaços de uma string
void str_trim(char *trim_origem, char *trim_destino) {
int flag = 0;
//Da esquerda para a direita
while(*trim_origem) {
//Se não tiver espaço em branco, define onde será a origem
if(!isspace((unsigned char) *trim_origem) && flag == 0) {
*trim_destino++ = *trim_origem;
flag = 1;
}
//Setando o começo do destino
trim_origem++;
if(flag == 1) {
*trim_destino++ = *trim_origem;
}
}
//Da direita para a esquerda
while(1) {
//Diminuindo o destino
trim_destino--;
//Se não tiver espaço em branco, finaliza o laço
if(!isspace((unsigned char) *trim_destino) && flag == 0) {
break;
}
//Seta a flag, e altera o caracter para definir o fim de uma string
flag = 0;
*trim_destino = '\0';
}
}
Referências:
Programming Simplified
Code Review
Bom pessoal, por hoje é só.
Abraços e até a próxima.

