View Full Version : Ficheiros em C
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
_kossak_ 17-06-2006, 13:00 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.
Hipnoted 17-06-2006, 23:06 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...
Fiz isto:
#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
_kossak_ 18-06-2006, 12:43 Parece-me OK. Bom trabalho.
Podes fazer um compara mais rápido:
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);
}
_kossak_ 18-06-2006, 12:53 Podes fazer um compara mais rápido:
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);
}
A comparação com EOF no while neste caso é desnecessária. :P
Não é não, porque EOF retorna -1 e não 0, logo se os ficheiros forem iguais entras em do-forever.
_kossak_ 18-06-2006, 13:33 Não é não, porque EOF retorna -1 e não 0, logo se os ficheiros forem iguais entras em do-forever.
Tens razão. Não tinha testado o código, tava só a fazer de cabeça.
Fiz alguns testes e a melhor forma é mesmo a versão que o Frenezy tinha posto.
Umas alterações...
#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...
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
nunoalex 19-06-2006, 21:10 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?
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?
int tipo; para controlar o tipo da union
|
|