Ir ao conteúdo

C++ Comparação de arquivos em C


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

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
  • Solução
Postado

@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
Postado

 

 

 

@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

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...