View Full Version : [C] caricamento elenco da file
scarface7
15-06-2006, 14:27
salve ragazzi,
avrei una cosa da chiedervi:
devo fare un programma che mi carichi un elenco di auto da file con la seguente sintassi:
!marca!modello!prezzo!
ho creato la seguente funzione:
int carica(FILE *f,automobile el[])
{
int i,k;
for(i=0;!feof(f);i++){
for(k=0;(el[i].marca[k]=fgetc(f))!='!';k++);
el[i].marca[k]='\0';
for(k=0;((el[i].modello[k]=fgetc(f))!='!')&&!feof(f);k++);
el[i].modello[k]='\0';
fscanf(f,"%f \n ",&(el[i].prezzo));
}
return i;
}
vorrei chiedervi come devo fare per far caricare anche il primo punto esclamativo !...?
riesco solo a caricare marca,modello e prezzo,ma a causa del mancato caricamento del primo punto esclamativo a video l'elenco mi compare molto male..
ringrazio anticipatamente per le vostre risposte...
non fai prima con
fscanf("!%s!%s!%f!", el[i].marca, el[i].modello, &el[i].prezzo);
?
scarface7
16-06-2006, 12:25
no non mi carica nulla se faccio come dici tu...
chi altro saprebbe darmi un aiuto..per piacere
chi altro saprebbe darmi un aiuto..per piacerePotresti magari postare la dichiarazione della struttura automobile??
trallallero
16-06-2006, 14:09
no non mi carica nulla se faccio come dici tu...
perche' ci sono i ! dentro il file ;)
prova cosi':
int carica(FILE *f,automobile el[])
{
int i,k;
for(i = 0; !feof(f); i++ )
{
el[i].marca[0] = fgetc(f);
for( k = 1; (el[i].marca[k] = fgetc(f)) != '!'; k++ )
;
el[i].marca[k] = '\0';
el[i].modello[0] = fgetc(f);
for( k = 1; ((el[i].modello[k] = fgetc(f)) != '!' ) && !feof(f); k++ )
;
el[i].modello[k]='\0';
el[i].prezzo = '!';
fscanf( f, "%f \n ",&(el[i].prezzo+1));
}
return i;
}
scusa se ho reindentato ma era per capire ... non posso sdeindentarlo dopo :D
in pratica leggi il primo carattere (!) e il ciclo parte da 1 anziche da 0
non so se ci sono errori non ho compilato e controllato bene. Comunque non e' un bel sistema, per me, per gestire records su file :mbe:
trallallero
16-06-2006, 14:47
Mi sa che:
el[i].modello[0] = fgetc(f);
la devi sostituire con:
el[i].modello[0] = '!';
perche' il char '!' l'ha gia' letto ed e' quello che fa interrompere il ciclo precedente.
Comunque ti consiglio records a lunghezza fissa.
In C gia' e' dura stare attenti a tutto, se ti complichi la vita
non ti passa piu' :muro:
poi leggi/scrivi interi blocchi con fread(..) e fwrite(...) ;)
scarface7
16-06-2006, 18:04
grazie..comunque non uso fread e fwrite perchè non rientrano nel programma.ora provo un pò e ti faccio sapere..
scarface7
16-06-2006, 18:08
niente ancora..neanche il tuo codice funziona..
vi copio il file txt da leggere:
8
!Opel!Astra!18000.00!
!Fiat!Punto!13500.00!
!Audi!A4!32000.00!
!Renault!Megane!22999.99!
!Fiat!Punto!13500.00!
!Opel!Corsa!12300.00!
!Alfa Romeo!147!29999.99!
!Citroen!C3!14850.00!
!Fiat!Multipla!15550.00!
scarface7
16-06-2006, 18:21
allora vi posto prima il codice della mia funzione e poi cosa mi compare a video:
CODICE:
int carica(FILE *f,automobile el[])
{
int i,k,n;
fscanf(f,"%d",&n);
for(i=0;!feof(f);i++){
fscanf(f,"!");
for(k=0;(el[i].marca[k]=fgetc(f))!='!';k++);
el[i].marca[k]='\0';
for(k=0;((el[i].modello[k]=fgetc(f))!='!')&&!feof(f);k++);
el[i].modello[k]='\0';
fscanf(f,"%f!\n",&(el[i].prezzo));
}
return i;
}
SCHERMATA A VIDEO:
digitare il nome del file da caricare: auto.txt
sono stati caricati 10 record dal file auto.txt
Premere un tasto per continuare . . .
visualizzazione dell'elenco a video:
!Opel!0.00
Astra!18000.00!0.00
Fiat!Punto!13500.00
Audi!A4!32000.00
Renault!Megane!22999.99
Fiat!Punto!13500.00
Opel!Corsa!12300.00
Alfa Romeo!147!29999.99
Citroen!C3!14850.00
Fiat!Multipla!15550.00
Premere un tasto per continuare . . .
potreste gentilmente correggere il mio errore..grazie
Giusto per darti un suggerimento:
#include <stdio.h>
typedef struct _elem {
char marca[16];
char modello[16];
float prezzo;
} elem;
int main()
{
elem el[10];
int i, j, dummy;
FILE *in = fopen("auto.txt", "r");
fscanf(in, "%d", &dummy);
printf("Letto: %d\n", dummy);
i = 0;
while (fscanf(in, " !%[^!]!%[^!]!%f!",
el[i].marca, el[i].modello,
&el[i].prezzo) == 3)
++i;
fclose(in);
printf("Caricati %d record\n\n", i);
puts(" marca | modello | prezzo |");
puts("---------------------------------");
for (j = 0; j < i; ++j) {
printf("%10s %10s\t%.2f\n",
el[j].marca, el[j].modello,
el[j].prezzo);
}
return 0;
}
goku@big:/tmp$ ./leggifile
Letto: 8
Caricati 9 record
marca | modello | prezzo |
---------------------------------
Opel Astra 18000.00
Fiat Punto 13500.00
Audi A4 32000.00
Renault Megane 22999.99
Fiat Punto 13500.00
Opel Corsa 12300.00
Alfa Romeo 147 29999.99
Citroen C3 14850.00
Fiat Multipla 15550.00
goku@big:/tmp$
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.