Ir ao conteúdo
  • Cadastre-se

C++ Comparação de arquivos em C


Ir à solução Resolvido por devair1010,

Posts recomendados

Crie um programa em C que compare dois arquivos texto (execicio2 e exercicio2a) através da leitura de strings de 20 posições dos dois arquivos e verifique se os mesmos são iguais. Mostre uma mensagem na tela avisando ao usuário.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
int main (){
    char texto1[20], texto2[20];
    FILE *arquivo;
    setlocale(LC_ALL, "");
    if ((arquivo=fopen ("exercicio2.txt", "w")) == NULL){
        printf ("Permissao negada.\n");
        return 1;
    }
    else {
        printf ("Digite uma string:");
        gets (texto1);
        fputs (texto1, arquivo);
        fclose (arquivo);
    }
    if ((arquivo=fopen ("exercicio2a.txt", "w"))== NULL){
            printf("Permissão negada.\n");
            return 1;
    }
    else {
        printf("Digite uma string:");
        gets (texto2);
        fputs (texto2, arquivo);
        fclose (arquivo);
    }

    /*if (fscanf(arquivo, "%s", texto1) == fscanf(arquivo, "%s", texto2)){
        printf("Conteúdo dos arquivos iguais.\n");
        return 1;
    }*/
    if ((strcmp(arquivo,texto1) == strcmp(arquivo,texto2))){
        printf("Conteúdo dos arquivos iguais.\n");
        return 1;
    }
    else {
        printf("Conteúdo dos arquivos diferente.\n");
        fclose(arquivo);

    }


}

A minha duvida é em como fazer para que os arquivos sejam comparados

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Solução

@Eduarda Menezes da Silveira    seu código está bom ,  mas as comparações no arquivo não são feitas dessa forma , comparando um arquivo com outro , é preciso comparar todas as palavras ou até mesmo os caracteres dentro do arquivo ,  e   como são dois arquivo então você precisa criar duas variáveis ponteiro , diferentes , para os arquivos , e para saber se os dois arquivos são iguais , você precisa , nesse caso , comparar palavra por palavra que estejam nos arquivos , e para isso você precisa ler no arquivo usando o comando fscanf que lê apenas uma palavra de cada vez até encontrar um espaço e depois pega a palavra do outro arquivo na mesma posição , e faz uma comparação , e se for diferente atribui um valor à uma variável para marcar que são diferentes e termina as comparações pois então esses arquivos são diferentes , mas se forem iguais  vai pesquisando no arquivo até encontrar o final do arquivo , o EOF (  end of file  )   , e depois de comparar todas as palavras dos dois arquivos , você verifica o valor daquela variável para saber se os dois arquivos são iguais ou não .  e você postou no tópico de c++ , mas seu código realmente é todo da linguagem c mesmo , mas isso não vem ao caso pois a linguagem c++ também aceito os comando da linguagem   c ,    e  então creio que seu código com algumas modificações poderia ser assim       :

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <locale.h>
#include <string.h>
int main(){
    system("color f9");/* colorir a tela do console no c , 1º digito Hexadecimal é cor de fundo , 2º é cor das letras */
    char texto1[20],texto2[20],op;
    int j,cont=0;
    int flag = 1;                /* marca que os dois arquivos são iguais */
    FILE *arquivo, *arquivo2;
    setlocale(LC_ALL,"");
    arquivo=fopen("exercicio2.txt","w");
    if(arquivo == NULL){
        printf("Permissao negada.\n");
        return 1;
    }
    else{
        do{
            printf("Digite a %d%c string do arquivo1 : ",cont+1,166);
            gets  (texto1);
            fputs (texto1, arquivo);
            fputs(" ",arquivo);                    /* organizando no arquivo */
            cont++;
            printf("Quer Inserir Outra S/N");
            op = (char)getch();
            printf("\n");
        }while( toupper(op) !='N' && cont < 20 );  /* guardar no máximo 20 palavras nesse arquivo */
        fclose(arquivo);
    }
    printf("\n");
    cont = 0;
    arquivo2 =fopen("exercicio2a.txt","w");
    if(arquivo2 == NULL){
            printf("\nPermissão negada.\n");
            return 1;
    }
    else {
        do{
            printf("Digite a %d%c string do arquivo2 : ",cont+1,166);
            gets  (texto2);
            fputs (texto2, arquivo);
            fputs(" ",arquivo);                  /* organizando no arquivo                                   */
            cont++;
            printf("Quer Inserir Outra S/N");
            op = (char)getch();                  /* converte um int para char , pois o getch pegar é int     */
            printf("\n");
        }while( toupper(op) !='N' && cont < 20 );/* guardar no máximo 20 palavras nesse arquivo              */
        fclose(arquivo2);                        /* o toupper converte minusculo para maiusculo              */
    }
    arquivo =fopen("exercicio2.txt", "r");       /* abre os dois arquivos nessas sequência                   */
    arquivo2=fopen("exercicio2a.txt","r");       /* o segundo depois do primeiro                             */
    for(j=0;j<20;j++){                           /* aqui verifica apenas as 20 primeiras palavras do arquivo */
        if(strcmp(texto1,texto2)!= 0 ){
            flag=0;break;}                       /* informa que uma palavras na mesma posição é diferentes   */
                                                 /* e termina o loop , pois aí os arquivos já são diferentes */
        if(fscanf(arquivo ,"%s",texto1)==EOF )break;/* pega huma palavra no arquivo até encontrar o final do arquivo */
        if(fscanf(arquivo2,"%s",texto2)==EOF )break;/* pega huma palavra no arquivo2 até encontrar o final do arquivo*/
    }
    fclose(arquivo2);                            /* e fecha na sequência inversa                             */
    fclose(arquivo );                            /* fecha o segundo e depois o primeiro , igual ao push e pop*/
    if( flag ){                                  /* informa depois de todas as comparações se todas as       */
                                                 /* palavras são iguais                                      */
        printf("\n\nConteúdo dos arquivos iguais.\n");
        return 1;
    }
    else                                         /* ou não                                                   */
        printf("\n\nConteúdo dos arquivos diferente.\n");
    printf("\n\n");
    return 0;
}

 

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

 

 

 

@Eduarda Menezes da Silveira

 

Como @devair1010 escreveu, todo contato com um arquivo é feito através de uma estrutura FILE. E quando você tenta abrir o arquivo o sistema preenche a que você passou como parâmetro e a partir daí você usa o arquivo através do ponteiro

 

Todo o contato com dois arquivos é então feito a partir de duas dessas estruturas, já que você precisa acessar os dois ao mesmo tempo

 

Permissao Negada?

Porque imprime isso? Não está claro que o open() fracassou por erro de permissão: pode ser que o arquivo não exista, ou o nome seja inválido, ou qualquer coisa... Em C você pode sempre chamar perror() quando deu erro e ter uma mensagem explicando o que aconteceu

FILE* lista = fopen("arquivo.txt","r");
if(lista==NULL)
{
    perror("Deu esse erro: ");
}

E se o arquivo não existe por exemplo mostra

Deu esse erro:: No such file or directory

 

"Entre com a string:"?

 

Agora isso eu não entendi mesmo... No seu programa ou no que @devair1010 escreveu: não se trata de ler nada do teclado.Tudo que seu programa deve fazer é dizer se os dois arquivos são ou não são iguais. É o que está escrito lá: 

Você abre os dois arquivos e lê linha a linha, limitando a leitura a 20 caracteres por linha. E verifica se os arquivos são idênticos em termos dos primeiros 20 caracteres de cada linha. Só isso. Ex: 

Exercicio2.txt

linha 1
linha 2
01234567890123456789 mais de vinte

Exercicio2a.txt

linha 1
linha 2
01234567890123456789

Eles são iguais porque até os 20 caracteres eles são idênticos....

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...