1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ficheiros em C

Discussão em 'Programação' iniciada por Frenezy, 17 de Junho de 2006. (Respostas: 12; Visualizações: 5943)

  1. Tava aki a fazer uns exames do ano anterior de uma cadeira de C quando vi este exercício (que penso que não foi muito abordado este género de exs este ano) e tá dificil.

    Especifique o algoritmo para um programa que depois de ler o nome de dois ficheiros vai comparar o seu conteúdo. O programa deverá dar como resultado uma mensagem indicando que os ficheiros são iguais ou, em caso contrário, uma mensagem indicando qual a posição (em número de bytes) a partir da qual eles diferem.

    Obrigado
     
  2. _kossak_

    _kossak_ Power Member

    O mais simples é tentar o algoritmo naïve http://en.wikipedia.org/wiki/String_searching_algorithm

    Basicamente por cada caracter lido no ficheiro A, lês um do ficheiro B. Se forem iguais avanças, caso contrário páras imediatamente e retornas o número de caracteres lidos no ficheiro A para teres a posição em que os ficheiros diferem. Se chegares ao fim dos ficheiros ao mesmo tempo é porque são iguais.
     
  3. Hipnoted

    Hipnoted Power Member

    Simples, les os dois ficheiros byte a byte, comparas o que leste. A cada byte que leste incrementas um contador. Se forem diferentes devolve o contador senao diz que sao iguais.

    Eu ate te fazia o programa, nao fosse estar em exames nesta altura. Sabes como é se nao me ponho fino...
     
  4. Fiz isto:
    Código:
    #include <stdio.h>
    
    void compara (char file1[], char file2[])
    {
    	int i=1;
    	char a, b;
    	FILE *fp, *fd;
    	fp=fopen(file1,"r");
    	fd=fopen(file2,"r");
    	a=fgetc(fp);
    	b=fgetc(fd);
    	while (a==b&&a!=EOF&&b!=EOF)
    	{
    		++i;
    		a=fgetc(fp);
    		b=fgetc(fd);
    	}
    	if(a!=b) printf("Os ficheiros diferem a partir de %d\n",i);
    	else printf("Os ficheiros são iguais\n");
    	fclose(fp);
    	fclose(fd);
    }
    
    int main()
    {
    	char file1[30], file2[30];
    	printf("Nome do ficheiro: ");
    	scanf("%[^\n]",file1);
    	scanf("%*[^\n]");scanf("%*c");
    	printf("Nome do ficheiro: ");
    	scanf("%[^\n]",file2);
    	scanf("%*[^\n]");scanf("%*c");
    	compara (file1,file2);
    }
    Se for isto até era +/- fácil...
    Obrigado por tudo
    Abraço
     
  5. _kossak_

    _kossak_ Power Member

    Parece-me OK. Bom trabalho.
     
    Última edição: 18 de Junho de 2006
  6. jaac

    jaac Power Member

    Podes fazer um compara mais rápido:
    Código:
    void compara (char file1[], char file2[])
    {
    	char a, b;
    	FILE *fp, *fd;
    	int i = 0;
    	
    	fp = fopen(file1,"r");
    	fd = fopen(file2,"r");
    
    	while( a == b && (a = fgetc(fp)) !=EOF && (b = fgetc(fd)) != EOF)
    		++i;
    	
    	if( a != b )
    		printf("Os ficheiros diferem a partir de %d\n",i);
    	else
    		printf("Os ficheiros são iguais\n");
    	
    	fclose(fp);
    	fclose(fd);
    }
     
  7. _kossak_

    _kossak_ Power Member

    A comparação com EOF no while neste caso é desnecessária. :P
     
  8. Warrior

    Warrior Power Member

    Não é não, porque EOF retorna -1 e não 0, logo se os ficheiros forem iguais entras em do-forever.
     
  9. _kossak_

    _kossak_ Power Member

    Tens razão. Não tinha testado o código, tava só a fazer de cabeça.
     
  10. jaac

    jaac Power Member

    Fiz alguns testes e a melhor forma é mesmo a versão que o Frenezy tinha posto.
     
    Última edição: 18 de Junho de 2006
  11. Umas alterações...
    Código:
    #include <stdio.h>
    
    void compara (char file1[], char file2[])
    {
    	int i=0;
    	char a, b;
    	FILE *fp, *fd;
    	fp=fopen(file1,"r");
    	fd=fopen(file2,"r");
    	if(fp&&fd)
    	{
    		do
    		{
    			a=fgetc(fp);
    			b=fgetc(fd);
    			++i;
    		}while(a==b&&a!=EOF&&b!=EOF);
    		fclose(fp);
    		fclose(fd);
    		if(a!=b) printf("Os ficheiros diferem a partir de %d\n",i);
    		else printf("Os ficheiros são iguais\n");
    	}
    	else printf("Erro na leitura do ficheiro\n");
    }
    
    int main()
    {
    	char file1[30], file2[30];
    	printf("Nome do ficheiro: ");
    	scanf("%[^\n]",file1);
    	scanf("%*[^\n]");scanf("%*c");
    	printf("Nome do ficheiro: ");
    	scanf("%[^\n]",file2);
    	scanf("%*[^\n]");scanf("%*c");
    	compara (file1,file2);
    }
    
    .....................................................................................................................................................................................
    Já agora...
    Se quiser fazer uma estrutura por exemplo para uma folha de cálculo, em que são válidos inteiros, floats e texto, tinha pensado em fazer uma coisa do género...

    Código:
    typedef struct sBD
    {
    	int inteiro;
    	float real;
    	char palavra[50];
    }BD;
    
    ............................
    
    int main()
    {
    	BD b[1000][1000];
    	............................
    }
    Mas, como uma célula pode apenas ter ou inteiro, ou real, ou texto se calhar não é a melhor maneira.
    Se alguém tiver alguma coisa em mente e que possa dizer...
    Obrigado
     
  12. nunoalex

    nunoalex Power Member

    E se colocares uma union dentro da struct??
    estilo:

    struct sFolha
    {
    int tipo; para controlar o tipo da union
    union uTipo
    {
    int inteiro;
    float real;
    char texto [50];
    } Tipo;
    } Folha;

    nao se e isto que tavas a pensar......

    PS: isto e de um exame de Progamação Imperativa certo?
     
  13. Sim é um exame de programação imperativa.

    uma union reserva o espaço correspondente ao maior campo. Certo?
    Por isso ao alterar uma valor na union também são alterados os outros elementos.

    Como é que controlas o tipo da union com int tipo?
     

Partilhar esta Página