View Full Version : [c] assegnare valori alle variabili da file di testo
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?
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)...
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.
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..
ho capito l'errore.. sballa tutto perchè nel file ignora gli spazi all'inizio, prima della prima stringa.. come posso rimediare a questo?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.