Enviado em 04/10/2016 - 16:41h
Boa tarde pessoal, será que vocês podem me dar uma ajuda por favor?//comparando hash int i, j = 0; while((fscanf(fp, "%s %s", hashArquivo, nomeArquivo)) != EOF) { printf("i = %d e hashArquivo = %s\n", i, hashArquivo); getchar(); while((fscanf(fp, "%s %s", hashArquivoCmp, nomeArquivoCmp)) != EOF) { printf("j = %d e hashArquivoCmp = %s\n", i, hashArquivoCmp); getchar(); if (i != j) { if ((strcmp(hashArquivo, hashArquivoCmp)) == 0) { printf("%s %s\n", hashArquivo, hashArquivoCmp); puts("arquivos iguais"); getchar(); } } j++; } }
Enviado em 10/10/2016 - 22:15h
O objetivo da string de formatação foi proteger o programa contra eventuais dados inválidos, que poderiam exceder os tamanhos máximos das strings ou conter valores inapropriados. Como todos os dados com os quais o programa trabalha são strings, eu me valho de duas coisas: a especificação de tamanhos máximos que cada string pode ter, e da limitação de quais caracteres podem estar presentes em cada string.Enviado em 05/10/2016 - 15:22h
Estou tentando entender o código, mas algumas coisas me escapam.Enviado em 05/10/2016 - 16:51h
Olá boa tarde, realmente faltou incrementar o valor de i.Enviado em 05/10/2016 - 17:10h
Enviado em 05/10/2016 - 17:24h
Ah, outra coisa: se o nome de algum dos seus arquivos contiver espaços, seu programa vai quebrar, já que a conversão "%s" da família scanf() considera que a string não contém espaços. Recomendo que você mude o modo de ler as linhas do arquivo.Enviado em 06/10/2016 - 16:01h
Pois é Paulo, eu já tinha notado o problema do espaço no nome dos arquivos, até ai tudo bem, mas eu agora descobri que estava fazendo um uso equivocado da função fscanf, pelo menos para o meu nível de conhecimento, vou procurar estudar ela mais a fundo, pois eu tinha declarado um FILE *fp e estava tentando usar o mesmo ponteiro para comparar duas variáveis diferentes, agora eu fiz a seguinte modificação, eu declarei dois ponteiros do tipo FILE e percorro eles usando um while externo e outro interno, como eu já vinha fazendo, a diferença é que eu abro o ponteiro interno com fopen antes do while interno e fecho no fim do while externo, para sempre retornar ao inicio do arquivo, já que eu desconheço uma outra maneira de retornar ao inicio do arquivo, para o uso atual basta, mas como eu disse, eu preciso procurar informações mais a fundo. Para não ficar confuso o que eu disse acima segue o trecho do código que eu usei para teste agora:FILE *fp, *fp2; char s[20] = "hashArquivos.txt"; fp = fopen(s, "r"); if (fp == NULL) { puts("Impossivel abrir o arquivo"); getchar(); } else { int i, j = 0; while((fscanf(fp, "%s %s", hashArquivo, nomeArquivo)) != EOF) { printf("%s %s - %d\n", hashArquivo, nomeArquivo, i); i++; j = 0; fp2 = fopen(s, "r"); while((fscanf(fp2, "%s %s - %d\n", hashArquivoCmp, nomeArquivoCmp)) != EOF) { printf("%s %s - %d\n", hashArquivoCmp, nomeArquivoCmp, j); j++; } fclose(fp2); } puts("fechando arquivos..."); getchar(); fclose(fp); }
Enviado em 06/10/2016 - 16:44h
Eu não estou falando de fazer manualmente. O sort facilita a sua vida como programador também pois, como eu disse antes, você não vai mais precisar de dois loops, pois vai bastar comparar o md5 de uma linha com o da linha seguinte.Enviado em 06/10/2016 - 17:10h
Opa corrigido, fiz uma pequena confusão rs, mas no teste tinha funcionado bem, eu confesso que eu não entendo como iterar comparando uma linha com a outra, eu entendo como percorrer do inicio ao fim do arquivo, agora iterar linha a linha isso me causa uma confusão ainda e eu não consigo enxergar de que forma posso fazer isso.Enviado em 07/10/2016 - 09:00h
Abra o arquivo. Leia o primeiro registro. Se der erro de leitura, encerre. Copie o registro lido para a “anterior”. Enquanto conseguir ler novo registro, se o registro lido for igual a “anterior”, indique que o registro é igual; copie o registro lido por cima de “anterior”. Feche o arquivo.
Enviado em 07/10/2016 - 11:08h
O código que você postou não tem a comparação para ver se os hashes são iguais. Creio que você esqueceu dela na hora de transcrever.char hash1[33], hash2[33]; char file1[4096], file2[4096]; int line1, line2; long saved_position; int result; hash1[32]=hash2[32]=file1[4095]=file2[4095]='\0'; // Garante que todas as strings terão o byte terminador. line1=0; rewind(fp); // Volta para o início do arquivo para ter certeza de que vai ler todos os registros. while((result=fscanf(fp, "%32[0-9a-z] %4095[^\n]%*1[\n]", hash1, file1))==2){ line1++; line2=line1; saved_position=ftell(fp); // Guarda posição atual do ponteiro de arquivo. while((result=fscanf(fp, "%32[0-9a-z] %4095[^\n]%*1[\n]", hash2, file2))==2){ line2++; if(strcmp(hash1, hash2)==0){ printf("Arquivos \"%s\" e \"%s\" têm a mesma assinatura.\n", file1, file2); } } if(result==EOF) fseek(fp, saved_position, SEEK_SET); else break; } if(result!=EOF){ fprintf(stderr, "Formato inválido ao tentar ler a linha %d.\n", line2+1); }
Enviado em 10/10/2016 - 16:38h
Boa tarde Paulo,Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Descritores de Arquivos e Swappiness
Fez porcaria no teu repositório Git? Aprenda a restaurar uma versão anterior do seu código!
Restaurando Fontes de Download do Hydra no Linux
Atualizando "na marra" o YT-DLP quando começa a dar erro de downloads
Como instalar o WPS com interface e corretor ortográfico em PT-BR no Arch Linux
Remover nome dos programas abertos (3)
plasma nao memoriza alterações na configuração (0)
Bluetooth CSR 4.0 Dongle (Alternativo) (3)