[RISOLTO] [C] Parsing: token in lettura da file
Buona sera a tutti!
Sono qui alla scrivania che cerco di far girare un codice che però non vuole fare come dico io, quindi chiedo il vostro aiuto
Il pezzo incriminato è questo:
Vi spiego cosa dovrebbe fare.
Alla prima riga apro un file; alla seconda riga dichiaro il buffer.
In seguito leggo una stringa di 50 caratteri da file e ne estraggo la prima parte [fino al primo punto] mettendola in buf.
ora espongo l'idea: io vorrei riuscire a leggere il file "una frase per volta" definendo come "frase" ciò che sta tra due punti.
Ho pensato di fare in questo modo: leggo da file una stringa che eccede la frase [l'esempio di questo test soddisfa l'ipotesi], poi estraggo la frase e la lavoro per quello che mi serve; poi devo passare alla seconda frase: per questo ho pensato di spostare il puntatore all'interno del file alla fine della frase che ho appena analizzato: a tale scopo memorizzo la lunghezza della frase e poi uso fseek per posizionarmi.
A questo punto, leggo ancora una stringa più lunga della prossima frase, estrapolo la frase con strtok, aggiorno la posizione ed il ciclo ricomincia.
Ora veniamo al problema: il codice compila senza problemi, ma quando gira va in loop il ciclo e mi stampa una serie di
Ho provato a modificare le condizioni di permanenza di while, mettendo che buf non abbia lunghezza nulla, che buf non sia una stringa vuota, che buf non sia \0, NULL... Ed anche delle condizioni su buffer, ma nulla di fatto.
Ora, da documentazione strtok dovrebbe restituire NULL quando arriva alla fine di una stringa, ma così non è.
Inoltre fgets dovrebbe aggiungere il '\0' in buffer, ma anche questo non sembra avere effetto.
Aspetto vostri suggerimenti; sono anche disposto a cambiare totalmente codice se avete una soluzione più intelligente, non devo rispettare vincoli o altro.
Grazie a tutti!
Nota 1: aggiungere 'i' alla posizione serve per spostarmi dopo il punto dopo ogni frase, ed il problema si presenta anche se lo tolgo.
Sono qui alla scrivania che cerco di far girare un codice che però non vuole fare come dico io, quindi chiedo il vostro aiuto

Il pezzo incriminato è questo:
FILE * text = fopen ("esempio", "r"); char buffer [50]; fgets (buffer, 50, text); char * buf = strtok (buffer, "."); int i = 0; printf("%s\n", buf); int position = strlen(buf); while (buf != NULL && strlen(buf) != 0) { fseek(text, position + i, SEEK_SET); fgets(buffer, 50, text); buf = strtok(buffer, "."); printf("%s\n", buffer); printf("%s\n", buf); printf("********************************************\n"); position += strlen(buf); i++; } fclose(text);
Vi spiego cosa dovrebbe fare.
Alla prima riga apro un file; alla seconda riga dichiaro il buffer.
In seguito leggo una stringa di 50 caratteri da file e ne estraggo la prima parte [fino al primo punto] mettendola in buf.
ora espongo l'idea: io vorrei riuscire a leggere il file "una frase per volta" definendo come "frase" ciò che sta tra due punti.
Ho pensato di fare in questo modo: leggo da file una stringa che eccede la frase [l'esempio di questo test soddisfa l'ipotesi], poi estraggo la frase e la lavoro per quello che mi serve; poi devo passare alla seconda frase: per questo ho pensato di spostare il puntatore all'interno del file alla fine della frase che ho appena analizzato: a tale scopo memorizzo la lunghezza della frase e poi uso fseek per posizionarmi.
A questo punto, leggo ancora una stringa più lunga della prossima frase, estrapolo la frase con strtok, aggiorno la posizione ed il ciclo ricomincia.
Ora veniamo al problema: il codice compila senza problemi, ma quando gira va in loop il ciclo e mi stampa una serie di
. ********************************************
Ho provato a modificare le condizioni di permanenza di while, mettendo che buf non abbia lunghezza nulla, che buf non sia una stringa vuota, che buf non sia \0, NULL... Ed anche delle condizioni su buffer, ma nulla di fatto.
Ora, da documentazione strtok dovrebbe restituire NULL quando arriva alla fine di una stringa, ma così non è.
Inoltre fgets dovrebbe aggiungere il '\0' in buffer, ma anche questo non sembra avere effetto.
Aspetto vostri suggerimenti; sono anche disposto a cambiare totalmente codice se avete una soluzione più intelligente, non devo rispettare vincoli o altro.
Grazie a tutti!

Nota 1: aggiungere 'i' alla posizione serve per spostarmi dopo il punto dopo ogni frase, ed il problema si presenta anche se lo tolgo.
Risposte
Ciao!!
Non so se ho ben capito ciò che vuoi fare, comunque io farei così:
Apro il file e inizio a leggere un carattere alla volta, quando incontro il primo punto vuol dire che la frase sta iniziando quindi imposto un flag a 1 per indicare che ho incontrato il punto e fino a che non incontro il secondo punto oppure il file non è finito mi salvo i caratteri, quando incontro il secondo punto imposto il flag a zero e interrompo il salvataggio dei caratteri e continuo così fino a quando non finisce il file, inoltre se il file termina e ho il flag ancora impostato a 1 vuol dire che ho incontrato solo un punto ma non il punto finale quindi (se non ho capito male quello che vuoi) questa non è una frase e la scarto...
Spero di essere stato chiaro...
Non so se ho ben capito ciò che vuoi fare, comunque io farei così:
Apro il file e inizio a leggere un carattere alla volta, quando incontro il primo punto vuol dire che la frase sta iniziando quindi imposto un flag a 1 per indicare che ho incontrato il punto e fino a che non incontro il secondo punto oppure il file non è finito mi salvo i caratteri, quando incontro il secondo punto imposto il flag a zero e interrompo il salvataggio dei caratteri e continuo così fino a quando non finisce il file, inoltre se il file termina e ho il flag ancora impostato a 1 vuol dire che ho incontrato solo un punto ma non il punto finale quindi (se non ho capito male quello che vuoi) questa non è una frase e la scarto...
Spero di essere stato chiaro...
Ciao! Avevo già pensato alla tua soluzione ma mi sembrava più lunga e macchinosa da implementare.
Ad ogni modo sono riuscito a risolvere il problema girando un po' le cose:
Funziona, ora dovrò solo mettere a posto i dettagli ma il nocciolo c'è.
Grazie comunque dell'aiuto!
Ad ogni modo sono riuscito a risolvere il problema girando un po' le cose:
FILE * text = fopen ("esempio", "r"); char buffer [BUFSIZ]; fgets (buffer, BUFSIZ, text); char * buf = strtok (buffer, "."); int i = 1; printf("%s\n", buffer); printf("%s\n", buf); printf("***********************************************\n"); int position = strlen(buf); fseek(text, position + i, SEEK_SET); while (fgets (buffer, BUFSIZ, text)) { buf = strtok(buffer, "."); position += strlen(buf); fseek(text, position + i, SEEK_SET); printf("%s\n", buffer); printf("%s\n", buf); i++; printf("********************************************\n"); } fclose(text);
Funziona, ora dovrò solo mettere a posto i dettagli ma il nocciolo c'è.
Grazie comunque dell'aiuto!