|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2009
Messaggi: 29
|
[C]Chiarimenti fopen
Salve forum, vorrei alcuni chiarimenti riguardo il comando fopen (per aprire e scrivere informazioni su file).
Per far ciò vi posto un esame universitario, dove in pratica la traccia come primo step chiedeva di aprire in lettura un file di testo .txt dove vi erano scritte le seguenti informazioni: 88-07-73507-X;2011;Novecento;Alessandro Baricco;10.60 88-07-92163-X;2011;Omero, Iliade;Alessandro Baricco;8.08 ecc... dove la prima parte indica il codice ISBN (con la variabile x da calcolare), indi anno, autore, prezzo ecc... e ogni informazione è separata da un punto e virgola. Perfetto, ordunque io so che per leggere i file da testo si fa così: Codice:
FILE *file_lettura;
file_lettura = fopen("books.txt", "r");
if(fp == NULL)
printf(“ERRORE in apertura del file”);
while(!feof(file_lettura))
{
fscanf(file_lettura, "%d", &numero);
printf("numero letto: %d\n", numero);
}
Ma in questo caso come si fà? Come si fa a far riconoscere il punto e virgola come fine informazione in lettura? Come posso mettere, per esempio, l'isbn in un intero, il nome in uno char* ecc...? Illuminatemi please! Il prof nella soluzione ha messo il seguente codice: Codice:
FILE *fp = fopen("books.txt", "r");
if (fp == NULL)
{
printf("ERROR - File books.dat not found\n");
return 0;
}
while(!feof(fp))
{
strcat(item.key,"\0");
fscanf(fp,"\n%256[^;]",item.key);
compute_checksum(item.key);
fscanf(fp,"\n;%d",&(item.pubyear));
strcat(item.title,"\0");
fscanf(fp,"\n;%256[^;]",item.title);
strcat(item.author,"\0");
fscanf(fp,"\n;%256[^;]",item.author);
fscanf(fp,"\n;%f",&(item.price));
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
mmmh effettivamente non mi è molto chiaro quello che fa la soluzione, io avrei utilizzato un strtok: http://www.elook.org/programming/c/strtok.html
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Mar 2009
Messaggi: 5
|
il c è un bel po' di tempo che non lo uso come linguaggio ma a vedere il contenuto del file le righe vengono ripetute in modo regolare a livello contenutistico, quindi perchè non creare una struct che abbia come dati ogni singolo elemento della riga? usando una struct non avresti il problema di capire quando finisce dato che andresti a leggere una quantità di dati pari alla lunghezza della struct stessa quindi avresti la stringa dell'isbn e così via...
qui hai una spiegazione del concetto di struct http://www.html.it/pag/15410/struct-typedef-e-union/ |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Passiamo al pezzo forte: la fscanf(). fscanf(fp,"\n%256[^;]",item.key); dice di lettere un massimo di 256 caratteri, fino ad un eventuale punto e virgola; infatti [^;] significa "NON LEGGERE il punto e virgola"; fscanf(fp,"\n;%d",&(item.pubyear)); legge un numero preceduto dal punto e virgola, quello non letto prima. Il codice e' ok. Personalmente preferisco leggere l'intera linea mediante la fgets() e poi analizzarla, magari mediante strtok() come suggerito da demos88 oppure strchr(), strstr(), .... E' anche piu' di una questione di stile: un eventuale errore compiuto dall'utente nella compilazione del file di ingresso potrebbe causare il crash (meglio: un ciclo infinito) nel codice del professore, mentre potrebbe essere benissimo catturato e gestito mediante fgets(). La fscanf() infatti ha il brutto vizio di fallire lasciando inalterato il puntatore al carattere corrente da leggere, in modo da essere riletto alla volta successiva e quindi continuare a fallire Non e' proprio il caso di questo codice, ma in caso di errore il codice del tuo professore non sara' in grado di accorgersene facilmente.... d'altronde il professore sta facendo didattica, non sta programmando un'applicazione vera....
__________________
In God we trust; all others bring data |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:42.




















