|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | ||
|
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9538
|
[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 11:13. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9538
|
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: 9538
|
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 12: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 12:06. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9538
|
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: 9538
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Aug 2001
Messaggi: 9538
|
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: 21:59.






















