PDA

View Full Version : [c] assegnare valori alle variabili da file di testo


ndakota
20-04-2007, 23:30
sto facendo una rubrica ma ho un problema..
per salvare nel file uso fprintf(fp,"%s %s %s ",s[j].nome,s[j].cognome,s[j].numero) ma quando ho bisogno di passarle alle variabili non posso usare ne fscanf(fp,"%s%s%s",&s[j].nome,&s[j].cognome,&s[j].numero) perchè se poi nel nome o nel cognome ci sono spazi me li tronca e sballa tutto ne fgets perchè non posso sapere a priori quanto sono lunghe le stringhe. possono essere massimo di 14 caratteri + fine stringhe ma anche meno e non posso saperlo.. qualcuno può aiutarmi?

cionci
21-04-2007, 10:36
Ci sono diverse strategie in questo caso:
- fai dei campi di dimensione fissa
- usi dei separatori

Per fare campi di dimensione fissa:

Supponiamo che nome cognome e numero abbiano dimensione massima 30 caratteri + il fine stringa (quindi 31).

fprintf(fp,"%30s%30s%30s",s[j].nome,s[j].cognome,s[j].numero);
In questo modo ti aggiunge automaticamente degli spazi fino a riempire i 30 caratteri...
In lettura operi con fgets mettendo come limite di dimensione appunto 30 per ogni campo.

Per i separatori:

Ad esempio puoi usare un carattere (ad esempio la virgola o il pipe) come separatore:

fprintf(fp,"%s,%s,%s",s[j].nome,s[j].cognome,s[j].numero);
Dopo per la lettura puoi leggerti su una stringa la riga intera e poi separarla con dei semplici passaggi (o con strtok o con qualche algoritmo di tua invensione)...

andbin
21-04-2007, 10:43
sto facendo una rubrica ma ho un problema..
per salvare nel file uso fprintf(fp,"%s %s %s ",s[j].nome,s[j].cognome,s[j].numero) ma quando ho bisogno di passarle alle variabili non posso usare ne fscanf(fp,"%s%s%s",&s[j].nome,&s[j].cognome,&s[j].numero) perchè se poi nel nome o nel cognome ci sono spazi me li tronca e sballa tutto ne fgets perchè non posso sapere a priori quanto sono lunghe le stringhe. possono essere massimo di 14 caratteri + fine stringhe ma anche meno e non posso saperlo.. qualcuno può aiutarmi?Ma i "record" di questa rubrica sono tutti su 1 riga unica o ognuno su una riga?? (non vedo \n nella fprintf, a meno che mandi il \n in seguito, non lo so...).

Comunque puoi innanzitutto scrivere le stringhe separate da un certo carattere speciale, per esempio il tab: fprintf(fp,"%s\t%s\t%s\t",.......
Quindi ti basta leggere la riga con fgets ma se come ho capito io hai tutto su 1 riga, allora potresti usare una funzione come quella che ho postato in <questo> (http://www.hwupgrade.it/forum/showthread.php?t=1397473) thread, che è in grado di leggere una riga di lunghezza arbitraria.

Dopodiché spezzi la stringa usando strtok, mettendo come delimitatore il tab \t.

ndakota
21-04-2007, 10:59
Ci sono diverse strategie in questo caso:
- fai dei campi di dimensione fissa
- usi dei separatori

Per fare campi di dimensione fissa:

Supponiamo che nome cognome e numero abbiano dimensione massima 30 caratteri + il fine stringa (quindi 31).

fprintf(fp,"%30s%30s%30s",s[j].nome,s[j].cognome,s[j].numero);
In questo modo ti aggiunge automaticamente degli spazi fino a riempire i 30 caratteri...
In lettura operi con fgets mettendo come limite di dimensione appunto 30 per ogni campo.

Per i separatori:

Ad esempio puoi usare un carattere (ad esempio la virgola o il pipe) come separatore:

fprintf(fp,"%s,%s,%s",s[j].nome,s[j].cognome,s[j].numero);
Dopo per la lettura puoi leggerti su una stringa la riga intera e poi separarla con dei semplici passaggi (o con strtok o con qualche algoritmo di tua invensione)...

aiuto please ho usato il primo metodo ma me li stampa tutti sballati..

ndakota
21-04-2007, 11:12
ho capito l'errore.. sballa tutto perchè nel file ignora gli spazi all'inizio, prima della prima stringa.. come posso rimediare a questo?