PDA

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...

Andlea
15-06-2006, 14:41
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

andbin
16-06-2006, 13:11
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

Qu@ker
16-06-2006, 20:11
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$