Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ricerca stringa in un file testo
Forum - C/C++ - Ricerca stringa in un file testo

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
iGuLy (Ex-Member)
Pro


Messaggi: 66
Iscritto: 17/05/2007

Segnala al moderatore
Postato alle 21:44
Lunedì, 24/03/2008
Ciao a tutti, volevo chiedervi se qualcuno potrebbe spiegarmi come fare a effettuare una ricerca di una stringa in un file di testo.
Per il momento sono riuscito a fare transferire il contenuto del file di testo in un array, l'unico problema è che non so come strutturare la ricerca nel file.

PM Quote
Avatar
FHF93 (Ex-Member)
Pro


Messaggi: 132
Iscritto: 13/11/2007

Segnala al moderatore
Postato alle 22:47
Lunedì, 24/03/2008
Bhè magari con la fscanf leggi da file ogni parola e con la strcmp() confronti da parola letta dal file con quella che vuoi trovare tu ...


Fabrizio
Dio disse : "chi odia la scuola scagli la prima pietra" ... E così nacquero le montagne...
PM Quote
Avatar
iGuLy (Ex-Member)
Pro


Messaggi: 66
Iscritto: 17/05/2007

Segnala al moderatore
Postato alle 22:59
Lunedì, 24/03/2008
Quindi se utilizzo fscanf prendo ogni parola, ma se io per esempio ho una stringa con degli spazi, fscanf  non potrà ma dirmi se esiste perchè mi passa parola per parola e quindi va bene solo per le parole.

PM Quote
Avatar
FHF93 (Ex-Member)
Pro


Messaggi: 132
Iscritto: 13/11/2007

Segnala al moderatore
Postato alle 23:59
Lunedì, 24/03/2008
dovrebbe essere così ... però ho pensato ad un altro metodo ... praticamente usi la fgets ( e quindi ti prendi l'intera riga di un file ).
Visto che la fgets salva su un buffer la riga del file, potresti scorrere questo buffer e vedere se il carattere corrente della stringa corrisponde al primo carattere della parola da cercare ... ti faccio un esempio: nel file scrivo

"ciao we sono pincopallino"
"hello world XD"

Con la fgets prendi la prima riga del file e la immagazzini in "char buffer[512];"
Ammettiamo che voglio cercare la stringa "we sono", memorizzata in "char ParolaDaCercare[512]"
Faccio così:
scorro char buffer a partire dall'indice di vettore 0 e lo confronto con ParolaDaCercare[0]
Iniziamo il ciclo:

buffer[0] = 'c'     ParolaDaCercare[0] = 'w'

buffer[0] e ParolaDaCercare[0] non sono uguali, quindi continuo con

buffer[1] = 'i'     ParolaDaCercare[0] = 'w'

buffer[1] e ParolaDaCercare[0] non sono uguali, quindi continuo con

buffer[2] = 'a'     ParolaDaCercare[0] = 'w'

buffer[2] e ParolaDaCercare[0] non sono uguali, quindi continuo con buffer[3] , buffer[4] ecc... confrontandoli sempre con ParolaDaCercare[0] .
Arrivo a buffer[6]:

buffer[6] = 'w'     ParolaDaCercare[0] = 'w'

Quindi il sesto carattere della stringa contenente la riga del file coincide con il primo carattere della parola da cercare : quindi da qui potremmo trovare la parola che stiamo cercando :D
Allora andiamo avanti e dopo aver trovato la posizione del buffer che coincide con il primo carattere della parola da cercare scriviamo una funzione che confronti le posizioni successive del buffer con le posizioni successive della parola da cercare .... questo ciclo terminerà quando arriveremo al carattere '\0' della parola da cercare, ovvero alla fine ... spero che hai capito il meccanismo ti posto il codice che ho fatto ( ti dice solo se la parola c'è non ti dice dove sta ne te la evidenzia, quello fallo tu ) ...
Comunque non so se c'è un altro metodo migliore, questo mi è venuto in mente in questo stesso momento :D

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int cerca(const char *vettore,const char *ric,int a);
  4.  
  5. int main()
  6. {
  7.  
  8. char let[512];
  9. char nome[512];
  10. char parola[2048];
  11. int a;
  12.  
  13.     printf("File da aprire > ");
  14.         gets(nome);
  15.     FILE *apri;
  16.         apri=fopen(nome,"r");
  17.         if(apri!=NULL){
  18.        
  19.         printf("Dimmi la lettera-frase-parola da cercare >");
  20.         gets(let);
  21.         printf("\n\n\t\t %s \n\n",nome);
  22.        
  23.        
  24.  
  25.   while((fgets(parola,2048,apri))!=NULL){
  26.    
  27.     //printf("%s\n\n",parola);
  28.     for(a=0;parola[a]!='\0';a++){
  29.           if(parola[a]==let[0]){
  30.                  if(cerca(parola,let,a)==1)
  31.                  printf("Trovato!!!!!!!!!");
  32.                  }
  33.       }  
  34. }    
  35. }
  36.  
  37. fflush(stdin);
  38. getchar();
  39. return 0;
  40. }
  41.  
  42. int cerca(const char *vettore,const char *ric, int offset){
  43. for(;*ric!='\0';offset++,ric++){
  44. //printf("[%c---%c]\n",*(vettore+offset),*ric);
  45. if(*(vettore+offset)!=*ric){
  46. return 0;
  47. }
  48. }
  49. return 1;
  50. }


Ultima modifica effettuata da FHF93 il 25/03/2008 alle 0:52


Fabrizio
Dio disse : "chi odia la scuola scagli la prima pietra" ... E così nacquero le montagne...
PM Quote
Avatar
iGuLy (Ex-Member)
Pro


Messaggi: 66
Iscritto: 17/05/2007

Segnala al moderatore
Postato alle 16:12
Martedì, 25/03/2008
Grazie per il consiglio, ho provato a fare come mi hai detto ma c'è un altra cosa che mi da problemi.
è che ,datto che il nome del file e la stringa vengono presi da riga di comando, non riesco ad usarli e non riesco a capire che conversione devo fare per inserirli in un altra variabile da usare al loro posto.

PM Quote
Avatar
FHF93 (Ex-Member)
Pro


Messaggi: 132
Iscritto: 13/11/2007

Segnala al moderatore
Postato alle 17:22
Martedì, 25/03/2008
se vuoi far partire il prog dal prompt fai così
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int cerca(const char *vettore,const char *ric,int a);
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.  
  8. char let[512];
  9. char nome[512];
  10. char parola[2048];
  11. int a;
  12.  
  13. if(argc!=3){
  14. printf("Uso: <Prog> <Nome File> <ParolaDaCercare> \n");
  15. return 1;
  16. }
  17.  
  18.     FILE *apri;
  19.     apri=fopen(argv[1],"r");
  20.     if(apri!=NULL){
  21.     printf("\n\n\t\t %s \n\n",argv[1]);
  22.    
  23.     sprintf(let,argv[2]);
  24.  
  25.   while((fgets(parola,2048,apri))!=NULL){
  26.    
  27.     //printf("%s\n\n",parola);
  28.     for(a=0;parola[a]!='\0';a++){
  29.       if(parola[a]==let[0]){
  30.          if(cerca(parola,let,a)==1)
  31.          printf("Trovato!!!!!!!!!");
  32.          }
  33.       }  
  34. }    
  35. }
  36.  
  37. fflush(stdin);
  38. getchar();
  39. return 0;
  40. }
  41.  
  42. int cerca(const char *vettore,const char *ric, int offset){
  43. for(;*ric!='\0';offset++,ric++){
  44. //printf("[%c---%c]\n",*(vettore+offset),*ric);
  45. if(*(vettore+offset)!=*ric){
  46. return 0;
  47. }
  48. }
  49. return 1;
  50. }



E dimmi se ti funziona ...


Fabrizio
Dio disse : "chi odia la scuola scagli la prima pietra" ... E così nacquero le montagne...
PM Quote
Avatar
iGuLy (Ex-Member)
Pro


Messaggi: 66
Iscritto: 17/05/2007

Segnala al moderatore
Postato alle 18:33
Martedì, 25/03/2008
Ok sono riuscito a far funzionare tutto, e ho messo che conta anche la riga della corrispondenza e le corrispondenze totali.
Grazie!!!!:D

PM Quote
Avatar
FHF93 (Ex-Member)
Pro


Messaggi: 132
Iscritto: 13/11/2007

Segnala al moderatore
Postato alle 19:47
Martedì, 25/03/2008
:D bene :D
Comunque credo che invece del mio metodo forse c'è una funzione fatta apposta ... ma fare i metodi da se è più divertente e soddisfacente :D
( questo è il mio centesimo post XD )

Ultima modifica effettuata da FHF93 il 25/03/2008 alle 19:48


Fabrizio
Dio disse : "chi odia la scuola scagli la prima pietra" ... E così nacquero le montagne...
PM Quote
Avatar
iGuLy (Ex-Member)
Pro


Messaggi: 66
Iscritto: 17/05/2007

Segnala al moderatore
Postato alle 20:46
Martedì, 25/03/2008
Cmq credo anche che farsi un metodo da soli sia molto più soddisfacente e senza di te non ci sarei riuscito quindi ti ringrazio molto per gli aiuti che mi hai dato.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo