Ir ao conteúdo
  • Cadastre-se
Estudante0123

C Concatenar dois arquivos em um só

Recommended Posts

OLá, estou tentando concatenar dois arquivos, arquivo1 e arquivo2, fornecidos pelo usuario, em um terceiro, arquivo3, criado automaticamente. Quando compila, chega a criar um novo arquivo3 mas não ha nada escrito nele. Onde posso estar errando?

#include <stdio.h>
#include <string.h>


int main ()
{
    FILE *arquivo1;
    FILE *arquivo2;
    FILE *arquivo3;

    char nome1 [300], nome2 [300];
// abrindo arquivos
    printf ("Digite o nome do arquivo 1: ");
    scanf ("%s", &nome1);

    printf ("Digite nome do arquivo 2: ");
    scanf ("%s", &nome2);

    arquivo1 = fopen ("nome1", "r");
    arquivo2 = fopen ("nome2", "r");
    arquivo3 = fopen ("concatenado", "w");

// função para concatenar
    void concatenar ( FILE *base, FILE *copiado);

//concatenado arquivo 1 e 3
    concatenar (arquivo3, arquivo1);
//concatenando 2 e 3
    concatenar (arquivo3, arquivo2);

//Fechando arquivos
    fclose (arquivo1);
    fclose (arquivo2);
    fclose (arquivo3);

    return 0;
}

void concatenar ( FILE *base, FILE *copiado)
{
    char leitor [1000];

    while (fgets (leitor, sizeof leitor, copiado) != NULL)
    {
        fputs (leitor, base);
    }

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Estudante0123  Olá. Pelo q entendi você quer fazer a leitura de dois arquivos e gravar os dados lidos em um terceiro arquivo.

Apenas p o caso de haver espaços em um nome de um arquivo, recomendo fazer a leitura dos nomes dessa forma:

 

printf ("Digite o nome do arquivo 1: ");
scanf ("%[^\n]s", nome1);

Perceba q para ler uma string no scanf não é necessário o operador &, pois o nome de uma string por si só é um endereço de memória.

Mas o outro ponto é q você está passando os nomes das strings (nome1, nome2) usando aspas duplas. Seria isso:

 

arquivo1 = fopen (nome1, "r");
arquivo2 = fopen (nome2, "r");

Outro ponto: Se você abrir o arquivo para escrita no modo "w", o q vai acontecer é q o segundo arquivo vai sobrescrever o q escrito do primeiro arquivo, pois dessa forma você vai estar posicionando o ponteiro de escrita no início do arquivo.

Recomendo abrir o arquivo para escrita no modo "a". Que seria posicionar o ponteiro de escrita na final do arquivo. Com isso você não "apaga" o q já foi escrito no arquivo. Seria isso:

 

arquivo3 = fopen ("concatenado.txt", "a");

Fiz o teste aqui e funcionou. Interessante a sua ideia! :)

 

adicionado 10 minutos depois

Tem um outro ponto importante ao trabalhar com arquivos: Uma verificação (validação) é sempre muito bem vinda, por exemplo:

 

if (!arquivo1) { // ou se preferir arquivo1 == NULL
    printf("Nao foi possivel abrir o arquivo!\n");
}

Fazendo sempre uma validação como essa você vai estar evitando problemas.

Creio q todo bom professor de C diria isso, pois é algo fundamental ao trabalhar com arquivos

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Estudante0123 Você está colocando a extensão dos arquivos ao digitar o nome dos mesmos? Por ex: "ArquivoTal.txt"

adicionado 1 minuto depois

Aqui funcionou certinho

adicionado 10 minutos depois

Só tem mais um ponto q esqueci de frisar: O protótipo da função você está colocando no meio do main. O correto é colocar depois dos "includes", logo no início do código:

 

#include <stdio.h>
#include <stdlib.h>  // para a macro NULL


// função para concatenar
void concatenar ( FILE *base, FILE *copiado);

E aí tira o protótipo da função para concatenar de dentro do main

adicionado 20 minutos depois

O código de modo bem básico ficaria assim:

 

#include <stdio.h>
#include <stdlib.h>  // para a macro NULL

// função para concatenar
void concatenar ( FILE *base, FILE *copiado);
void limpa_linha();

int main ()
{
    FILE *arquivo1;
    FILE *arquivo2;
    FILE *arquivo3;

    char nome1 [300], nome2 [300];

    // abrindo arquivos
    printf ("Digite o nome do arquivo 1: ");
    scanf ("%[^\n]s", nome1);
    limpa_linha();

    printf ("Digite o nome do arquivo 2: ");
    scanf ("%[^\n]s", nome2);
    limpa_linha();

    arquivo1 = fopen (nome1, "r");

    if (!arquivo1) { // ou se preferir arquivo1 == NULL
        printf("Nao foi possivel abrir o arquivo 1!\n");
    }

    arquivo2 = fopen (nome2, "r");

    if (!arquivo2) { // ou se preferir arquivo2 == NULL
        printf("Nao foi possivel abrir o arquivo 2!\n");
    }

    arquivo3 = fopen ("concatenado.txt", "a");

    if (!arquivo3) { // ou se preferir arquivo3 == NULL
        printf("Nao foi possivel abrir o arquivo 3!\n");
    }


    //concatenado arquivo 1 e 3
    concatenar (arquivo3, arquivo1);
    //concatenando 2 e 3
    concatenar (arquivo3, arquivo2);


    //Fechando arquivos
    fclose (arquivo1);
    fclose (arquivo2);
    fclose (arquivo3);

    return 0;
}

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}


void concatenar ( FILE *base, FILE *copiado)
{
    char leitor [1000];

    while (fgets (leitor, sizeof leitor, copiado) != NULL)
    {
        fputs (leitor, base);
    }
}

 

adicionado 29 minutos depois

Também  é importante lembrar o seguinte: Se o arquivo q você queira copiar está na mesma pasta do seu código basta colocar o nome do arquivo e a extensão, mas se o arquivo está em uma pasta diferente vai ser preciso digitar o caminho todo do arquivo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×