Jump to content

Programa que lê de um file .txt


PsySc0rpi0n
 Share

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
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
 Share

×
×
  • 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.