PDA

Visualizza la versione completa : [C] Problema con la lettura di parole da file di testo.


StartingToDive
13-02-2014, 11:54
Salve a tutti, ho un file di testo in cui i dati sono salvati, riga per riga, nel seguente formato:
parola1;parola2;parola3

Io devo salvare ogni parola in una stringa differente. A tal proposito, avevo provato con un


fscanf(file.txt, "%s;%s;%s", stringa1, srtinga2, stringa3);

pensando che la fscanf() funzionasse come la scanf() e che fosse quindi in grado di scaratare i ';'(Cosa che mi sembra di capire sia falsa).
Il risultato però era sballatissimo da quello che sarebbe dovuto essere, quindi ho provato un'altra soluzione: Leggo tutta la parola, la salvo in una stringa unica, compresi i ';', e poi la passo a una funzione che dovrebbe spezzare la stringa nelle tre sotto stringhe di cui ho bisogno.
La funzione è questa:


void stringTokenizer(char *src, char *s1, char *s2, char *s3, char sep) {
char *index;
index = strchr(src, sep);
strncpy(s1, src, index - src);
src = index + 1;
index = strchr(src, sep);
strncpy(s2, src, index - src);
src = index + 1;
strcpy(s3, src);
}


Questa funzione(Che non funziona, anche in questo caso l'output è orrendo) lavora sui puntatori a caratteri. Quello che non capisco è questo:


void stringTokenizer(char *src, char *s1, char *s2, char *s3, char sep) {
char *index;
index = strchr(src, sep); //index è l'indirizzo di memoria del primo ';'
strncpy(s1, src, index - src); //Parte che non capisco


Nell'istruzione della "parte che non capisco", il numero di caratteri che devono essere copiati da src a s1
è dato da index-src. Questa operazione tra puntatori, non dovrebbe darmi il numero di celle di memoria/caratteri prima del primo ';' ? Questo era quello che pensavo di aver capito, ma ho fatto stampare ad output index-src e viene un numero altissimo(Ho fatto una prova in cui sarebbe dovuto essere 5, e il risultato era un numero sull'ordine di grandezza delle migliaia). Qualcuno mi può spiegare cosa non ho capito? Grazie in anticipo.

Scara95
13-02-2014, 14:47
fscanf(file.txt, "%s;%s;%s", stringa1, srtinga2, stringa3);
file.txt che dovrebbe essere?? Prova con "%s;%s;%s\n"

In ogni caso quel codice che hai scritto è sbagliato perché strncpy non appende il terminatore di stringa ( '\0' ).

Poi è molto più semplice fare tre strtok:
strcpy(s1, strtok(src, ";"));
strcpy(s2, strtok(NULL, ";"));
strcpy(s3, strtok(NULL, "\n"));

Loading