iGuLy (Ex-Member)
Pro
Messaggi: 66
Iscritto: 17/05/2007
|
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.
|
|
FHF93 (Ex-Member)
Pro
Messaggi: 132
Iscritto: 13/11/2007
|
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 ...
|
|
iGuLy (Ex-Member)
Pro
Messaggi: 66
Iscritto: 17/05/2007
|
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.
|
|
FHF93 (Ex-Member)
Pro
Messaggi: 132
Iscritto: 13/11/2007
|
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
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
Codice sorgente - presumibilmente C++ |
#include <stdio.h> int cerca(const char *vettore,const char *ric,int a); int main() { char let[512]; char nome[512]; char parola[2048]; int a; printf("File da aprire > "); gets(nome); FILE *apri; apri=fopen(nome,"r"); if(apri!=NULL){ printf("Dimmi la lettera-frase-parola da cercare >"); gets(let); printf("\n\n\t\t %s \n\n",nome); while((fgets(parola,2048,apri))!=NULL){ //printf("%s\n\n",parola); for(a=0;parola[a]!='\0';a++){ if(parola[a]==let[0]){ if(cerca(parola,let,a)==1) printf("Trovato!!!!!!!!!"); } } } } fflush(stdin); getchar(); return 0; } int cerca(const char *vettore,const char *ric, int offset){ for(;*ric!='\0';offset++,ric++){ //printf("[%c---%c]\n",*(vettore+offset),*ric); if(*(vettore+offset)!=*ric){ return 0; } } return 1; }
|
Ultima modifica effettuata da FHF93 il 25/03/2008 alle 0:52 |
|
iGuLy (Ex-Member)
Pro
Messaggi: 66
Iscritto: 17/05/2007
|
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.
|
|
FHF93 (Ex-Member)
Pro
Messaggi: 132
Iscritto: 13/11/2007
|
se vuoi far partire il prog dal prompt fai così
Codice sorgente - presumibilmente C++ |
#include <stdio.h> int cerca(const char *vettore,const char *ric,int a); int main(int argc, char *argv[]) { char let[512]; char nome[512]; char parola[2048]; int a; if(argc!=3){ printf("Uso: <Prog> <Nome File> <ParolaDaCercare> \n"); return 1; } FILE *apri; apri=fopen(argv[1],"r"); if(apri!=NULL){ printf("\n\n\t\t %s \n\n",argv[1]); sprintf(let,argv[2]); while((fgets(parola,2048,apri))!=NULL){ //printf("%s\n\n",parola); for(a=0;parola[a]!='\0';a++){ if(parola[a]==let[0]){ if(cerca(parola,let,a)==1) printf("Trovato!!!!!!!!!"); } } } } fflush(stdin); getchar(); return 0; } int cerca(const char *vettore,const char *ric, int offset){ for(;*ric!='\0';offset++,ric++){ //printf("[%c---%c]\n",*(vettore+offset),*ric); if(*(vettore+offset)!=*ric){ return 0; } } return 1; }
|
E dimmi se ti funziona ...
|
|
iGuLy (Ex-Member)
Pro
Messaggi: 66
Iscritto: 17/05/2007
|
Ok sono riuscito a far funzionare tutto, e ho messo che conta anche la riga della corrispondenza e le corrispondenze totali.
Grazie!!!!
|
|
FHF93 (Ex-Member)
Pro
Messaggi: 132
Iscritto: 13/11/2007
|
bene
Comunque credo che invece del mio metodo forse c'è una funzione fatta apposta ... ma fare i metodi da se è più divertente e soddisfacente
( questo è il mio centesimo post XD )
Ultima modifica effettuata da FHF93 il 25/03/2008 alle 19:48 |
|
iGuLy (Ex-Member)
Pro
Messaggi: 66
Iscritto: 17/05/2007
|
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.
|
|