PsySc0rpi0n Posted July 20, 2013 at 10:40 PM Report #519488 Posted July 20, 2013 at 10:40 PM (edited) Boas... Estou a tentar fazer um programa que leia de um ficheiro .txt, cadeias de 32 caracteres seguidos, cadeias essas que podem estar no meio de lixo que possa eventualmente estar dentro do ficheiro, ou seja: se tiver este ficheiro txt com o seguinte conteúdo: */*-/-*/-****-earg-++-/--*abcdefghijklmnopqrstuvwyxy123450//*-+++ ~~~*/*-/-*/-****--++-/--*abcdefghijklmnopqrstuvwyxy123451//*-+++ ~~~ */*-/-*/-****--++-/--*abcdefghijklmnopqrstuvwyxy123452//*-+++ ~~~ */aergre34534*-/-*/-****--++-/--*abcdefghijklmnopqrstuvwyxy123453//*-+++ ~~~ */*-/-*/-****--++-/--*abcdefghijklmnopqrstuvwyxy123454//*-+++ ~~~ */*-/-*/-****--++-/--* abcdefghijklmnopqrstuvwyxy123455//*-+++ ~~~ */*-/-*/-****--++-/--* abcdefghijklmnopqrstuvwyxy123456//*-+++ ~~~ */*-/34ctw546456574$&/$%$%&%$-*/-****--++-/--*abcdefghijklmnopqrstuvwyxy123457//*-+++ ~~~ */*-/-*/-****--++-/--*abcdefghijklmnopqrstuvwyxy123458//*-+ ++ ~~~ */*-/-*/-****--++-/--*abcdefghijklmnopqrstuvwyxy123459//*-+++ ergd3t345#$%#$~~~ E tenho o seguinte code mas que não está a funcionar bem: #include <stdio.h> #include <string.h> #include <ctype.h> #define HASH_BUFFER 33 int main(int argc, char *argv[]){ char hashchar, hashkey[HASH_BUFFER] = ""; FILE *fp = NULL; int charcount = 0; switch(argc){ case 1: printf("Try ./Hash ? for help on usage!\n"); break; case 2: if(!strcmp(argv[1], "?")){ printf("Usage: ./Hash <path-to-file>\n"); break; }else{ if((fp = fopen(argv[1], "r")) == NULL){ printf("Error reading file %s!\n", argv[1]); return -1; } while((hashchar = fgetc(fp)) != EOF){ if(isalnum(hashchar) && (charcount >= 0 && charcount < 32)){ hashkey[charcount] = hashchar; charcount++; if(charcount == 31){ printf("%s\n", hashkey); putchar('\n'); hashkey[0] = '\n'; } }else{ charcount = 0; hashkey[0] = '\0'; continue; } } } break; default: printf("Too many arguments!\n"); } } e era suposto o code apenas imprimir, as cadeias de 32 caracteres alfanuméricos, uma em cada linha mas não o está a fazer correctamente. O output está a ser: abcdefghijklmnopqrstuvwyxy12345 abcdefghijklmnopqrstuvwyxy123450 abcdefghijklmnopqrstuvwyxy123451 abcdefghijklmnopqrstuvwyxy123452 abcdefghijklmnopqrstuvwyxy123453 abcdefghijklmnopqrstuvwyxy123454 abcdefghijklmnopqrstuvwyxy123455 abcdefghijklmnopqrstuvwyxy123456 abcdefghijklmnopqrstuvwyxy123457 abcdefghijklmnopqrstuvwyxy123458 A primeira linha não devia ser como está. Depois a partir daí está certo até à última linha que, no ficheiro txt não é a última linha, mas sim a penúltima... Preciso de dicas para colocar o programa a funcionar bem... Edited July 20, 2013 at 10:45 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
HappyHippyHippo Posted July 21, 2013 at 09:43 AM Report #519494 Posted July 21, 2013 at 09:43 AM if(charcount == 32){ // <------------------------ printf("%s\n", hashkey); putchar('\n'); hashkey[0] = '\n'; charcount = 0; // <--------------------- } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
PsySc0rpi0n Posted July 27, 2013 at 11:57 PM Author Report #520184 Posted July 27, 2013 at 11:57 PM (edited) Já alterei para isto mas continua a não dar!!! #include <stdio.h> #include <string.h> #include <ctype.h> #define HASH_BUFFER 33 int main(int argc, char *argv[]){ char hashchar, hashkey[HASH_BUFFER] = ""; FILE *fp = NULL; int charcount = 0; switch(argc){ case 1: printf("Try './Hash ?' for help on usage!\n"); break; case 2: if(!strcmp(argv[1], "?")){ printf("Usage: './Hash <path-to-file>'\n"); break; }else{ if((fp = fopen(argv[1], "r")) == NULL){ printf("Error reading file %s!\n", argv[1]); return -1; } while((hashchar = fgetc(fp)) != EOF){ if(isalnum(hashchar) && (charcount >= 0 && charcount < 32)){ hashkey[charcount++] = hashchar; if(charcount == 31){ printf("%s\n", hashkey); putchar('\n'); hashkey[0] = '\n'; } }else{ charcount = 0; hashkey[0] = '\0'; continue; } } } break; default: printf("Too many arguments!\n"); } } Edited July 27, 2013 at 11:59 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
Rui Carlos Posted July 28, 2013 at 01:06 AM Report #520186 Posted July 28, 2013 at 01:06 AM O HHH já te sugeriu duas alterações. Experimentaste-as? Rui Carlos Gonçalves
PsySc0rpi0n Posted July 28, 2013 at 08:55 AM Author Report #520193 Posted July 28, 2013 at 08:55 AM (edited) O HHH já te sugeriu duas alterações. Experimentaste-as? Como se pode ver, sim. Alterei o charcount == 32 para charcount == 31 e tirei o charcount = 0 de onde estava... Ou estava o HappyHippy a dizer para eu colocar o charcount == 32 e o charcount = 0 naqueles locais??? Edited July 28, 2013 at 08:57 AM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
Rui Carlos Posted July 28, 2013 at 09:53 AM Report #520197 Posted July 28, 2013 at 09:53 AM Olhando para o teu código original, já vejo lá charcount == 31, pelo que assumo que a ideia era mudar para 32. Rui Carlos Gonçalves
PsySc0rpi0n Posted July 28, 2013 at 10:17 AM Author Report #520198 Posted July 28, 2013 at 10:17 AM Pois, era isso mesmo, mas agora queria perceber porquê!!! Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
HappyHippyHippo Posted July 28, 2013 at 11:25 AM Report #520199 Posted July 28, 2013 at 11:25 AM Pois, era isso mesmo, mas agora queria perceber porquê!!! while((hashchar = fgetc(fp)) != EOF){ if (isalnum(hashchar) && (charcount >= 0 && charcount < 32)){ hashkey[charcount] = hashchar; charcount++; // a variável "charcount" tem o número de caracteres lidos correctamente if(charcount == 32){ // <------------------------ // se fizeres a comparação com 31, então estás a ignorar o último caracter printf("%s\n", hashkey); putchar('\n'); hashkey[0] = '\n'; charcount = 0; // <--------------------- // depois de validares uma cadeia inteira de 32 caracteres, tens de recomeçar a validação } else { // ... } } } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Rui Carlos Posted July 28, 2013 at 11:25 AM Report #520200 Posted July 28, 2013 at 11:25 AM O 32 parece-me simples de perceber. Se tens o valor 32, e tendo em conta que incrementaste o valor logo depois de guardares o caracter, é porque acabaste de guardar o caracter 31 (0-31 dá os 32 caracteres que pretendes). Se usasses o 31, só ias ter as posições 0-30 preenchidas. A ideia do 0 será terminar a sequência depois de leres 32 caracteres. Se não tiveres o zero, o que vai acontecer é que ele vai continuar a acrescentar os caracteres à mesma sequência, até que apareça um caracter não alfanumérico. Ou seja, se tiveres duas sequências seguidas, só a primeira é que será mostrada. Mais do que isso, irás escrever fora do buffer que tens alocado para guardar as sequências encontradas. Já agora, acho que tens para ali um break e um continue a mais. E falta-te um return no fim. Também era capaz de ser conveniente colocar um '\0' no final da string antes de a imprimir. Rui Carlos Gonçalves
PsySc0rpi0n Posted July 28, 2013 at 11:51 AM Author Report #520205 Posted July 28, 2013 at 11:51 AM (edited) Só não percebo é porque é que só lia mal a primeira linha e as outras lia-as bem e depois não lia a última sequência de 32 caracteres... Vou adicionar as correcções sugeridas e ver se percebo bem as explicações!!! Rui Carlos, dizes que é o continue e o último break que estão a mais? Edited; Não vi nenhum break que pudesse tirar... A que break te referes? Edited July 28, 2013 at 12:50 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
PsySc0rpi0n Posted August 1, 2013 at 09:31 AM Author Report #520579 Posted August 1, 2013 at 09:31 AM Bem, andava com ideias de começar um projecto mas não sei se tenho cohecimentos para o fazer. Precisava de saber sobre Regex e integração do Regex com C enão sei nada disto, por isso, este projecto para já vai hibernar!!! Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
Rui Carlos Posted August 1, 2013 at 10:52 AM Report #520589 Posted August 1, 2013 at 10:52 AM Rui Carlos, dizes que é o continue e o último break que estão a mais? Edited; Não vi nenhum break que pudesse tirar... A que break te referes? Referia-me ao segundo ao segundo break. Rui Carlos Gonçalves
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now