Jump to content
PsySc0rpi0n

Programa que lê de um file .txt

Recommended Posts

PsySc0rpi0n

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 by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo
if(charcount == 32){ // <------------------------
 printf("%s\n", hashkey);
 putchar('\n');
 hashkey[0] = '\n';
 charcount = 0; // <---------------------
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PsySc0rpi0n

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 by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
PsySc0rpi0n

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 by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
PsySc0rpi0n

Pois, era isso mesmo, mas agora queria perceber porquê!!!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
PsySc0rpi0n

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 by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
PsySc0rpi0n

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

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.