|
|
|
![]() |
|
Strumenti |
![]() |
#1 | ||
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9523
|
[C] Lettura da file e stampa a video
Ciao a tutti.
Ho un problema con una parte di esercizio e se non lo risolvo non posso andare avanti. ![]() Questo il testo della parte al momento interessata: Quote:
Codice:
#include<stdio.h> #include<string.h> #define MAX 50 struct tlibro{ char autori[MAX]; char titolo[MAX]; char tipologia[MAX]; }; struct tlibro libro; main() { int n; FILE *fp; fp=fopen("libri.txt","r"); if(fp==NULL) printf("Si e' verificato un'errore nell'apertura del file\n"); else{ int c; while(!feof(fp)){ n=fread(&libro,sizeof(struct tlibro),1,fp); printf("%s\n",libro.autori); printf("%s\n",libro.titolo); printf("%s\n",libro.tipologia); } fclose(fp); } system("pause"); } Quote:
![]() Il problema, secondo me, è che leggendo MAX caratteri dalla stringa si va a prendere anche quelle successive,ho provato anche con fgets() ed fscanf() ma senza risultato. Mi sapreste aiutare? ![]() |
||
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Strano, fgets dovrebbe risolvere: http://www.cplusplus.com/reference/c...dio/fgets.html
Infatti legge fino al primo newline che incontra... Sicuramente fread e fscanf non sono adatte, fread legge una numero di byte preimpostato, mentre fscanf si ferma al primo carattere di spazio, tab o newline... Ultima modifica di cionci : 07-07-2007 alle 10:13. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9523
|
Perfetto, con fgets() ho risolto, ieri l'avevo usata in modo improprio.
Ora mi sto scervellando su come mettere ciò che leggo nella struct ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9523
|
Mitico sta funzionando
![]() Codice:
#include<stdio.h> #include<string.h> #define MAX 50 struct tlibro{ char autori[MAX]; char titolo[MAX]; char tipologia[MAX]; }; struct tlibro libro; main() { int n; char aux[MAX]; FILE *fp; fp=fopen("libri.txt","r"); if(fp==NULL) printf("Si e' verificato un'errore nell'apertura del file\n"); else{ int c; while(!feof(fp)){ fgets(libro.autori,MAX,fp); fgets(libro.titolo,MAX,fp); fgets(libro.tipologia,MAX,fp); printf("%s",libro.autori); printf("%s",libro.titolo); printf("%s",libro.tipologia); } fclose(fp); } system("pause"); } ![]() Ma sta funzionando perché ogni fgets() legge fino a fine stringa ed essendocene tre di fgets() leggo tre stringhe alla volta, che poi vanno nella struct...ho capito giusto? ![]() Ultima modifica di Xfree : 07-07-2007 alle 11:13. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Sì. Comunque sarebbe più valido e logico che i dati del singolo "record" siano su una unica riga, separati da un delimitatore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì, ma al posto di sizeof(aux) devi mettere MAX...
Infatti la fgets se trovasse una stringa molto lunga si fermerebbe prima della fine della riga e visto che la stringa della struttura è lunga MAX devi specificare quello nel campo... Edit: ignora quello che avevo scritto...fgets legge da sola un massimo di MAX-1 caratteri... Ultima modifica di cionci : 07-07-2007 alle 11:06. |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9523
|
Quote:
![]() Ma ora mi hai fatto venire la curiosità, come si farebbe a leggere i dati separati da delimitatore? |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
O fai una tua funzioncina ad hoc che scorre la stringa e la scompone...o usi strtok...
http://www.cplusplus.com/reference/c...ng/strtok.html Anche se sinceramente strtok non mi è mai stata molto simpatica... In teoria ci sarebbe anche la possibilità di usare sscanf indicando nello specificatore di tipo il carattere a cui deve arrestare la lettura della stringa... |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9523
|
Quote:
|
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9523
|
Quote:
Grazie per l'aiuto! ![]() |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
sscanf è uguale alla scanf, solo che effettua la lettura da una stringa invece che dallo standard input...
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:21.