PDA

View Full Version : [C]Problemi con feof()


stgww
15-05-2008, 17:58
Ciao a tutti. Ho fatto questi tre programmi per esercitarmi con i file. Tutto funziona fino a che nei vari for metto il numero di cicli pari ad un numero, ma quando lo cambio con feof, allora cominciano i problemi, il primo record mi si sballa:confused:
Ecco i programmi:
1)Carico il file#include <stdlib.h>
#include <stdio.h>

struct rec
{
char titolo[30], autore[30];
float durata;
};

int main()
{
struct rec cd;
int i;

FILE*list;
list=fopen("dati.bin", "w");

for(i=0;i<3;i++)
{
printf("Titolo?\n");
scanf("%s", cd.titolo);
printf("Autore?\n");
scanf("%s", cd.autore);
printf("Durata (in minuti)?\n");
scanf("%f", &cd.durata);
fwrite(&cd,sizeof(struct rec),1,list);
system("CLS");
}
fclose(list);

system("PAUSE");
return 0;
}
2)Lo visualizzo e fino qui nessun problema#include <stdlib.h>
#include <stdio.h>

struct rec
{
char titolo[30], autore[30];
float durata;
};

int main()
{
struct rec cd;
int i;
FILE*list;
list=fopen("dati.bin", "r");
for(i=0;i=!feof(list);i++)
{
fread(&cd,sizeof(struct rec),1,list);
printf("Titolo %s \n", cd.titolo);
printf("Autore %s \n", cd.autore);
printf("Durata:%f \n", cd.durata);

}
fclose(list);

system("PAUSE");
return 0;
}
3)Provo ad elaborarlo un po'#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct rec
{
char titolo[30], autore[30];
float durata;
};

int show_user(struct rec cd,FILE*list)
{
char titolo[30];
int i;

list=fopen("dati.bin", "r");
printf("Titolo dell'album che vuoi cercare?\n");
scanf("%s", titolo);
for(i=0;i=!feof(list);i++)
{
fread(&cd,sizeof(struct rec),1,list);

if((strcmp(titolo,cd.titolo))==0)
{

printf("Titolo %s \n", cd.titolo);
printf("Autore %s \n", cd.autore);
printf("Durata:%f \n", cd.durata);
}
}
fclose(list);


return 0;
}

int edit_user(struct rec cd,FILE*list)
{
char titolo[30];
int i,n;
list=fopen("dati.bin", "r+");
printf("Titolo dell'album che vuoi modificare?\n");
scanf("%s", titolo);
for(i=0;i=!feof(list);i++)
{
fread(&cd,sizeof(struct rec),1,list);
if(strcmp(titolo,cd.titolo)==0)
n=i;
}
fseek(list,n,0);
printf("Titolo?\n");
scanf("%s", cd.titolo);
printf("Autore?\n");
scanf("%s", cd.autore);
printf("Durata (in minuti)?\n");
scanf("%f", &cd.durata);
fwrite(&cd,sizeof(struct rec),1,list);
return 0;
}

int add(struct rec cd,FILE*list)
{
list=fopen("dati.bin", "a");
printf("Titolo?\n");
scanf("%s", cd.titolo);
printf("Autore?\n");
scanf("%s", cd.autore);
printf("Durata (in minuti)?\n");
scanf("%f", &cd.durata);
fwrite(&cd,sizeof(struct rec),1,list);
fclose(list);
return 0;

}
int main()
{
struct rec cd;
int i,function1;

FILE*list;
show_user(cd,list);
edit_user(cd,list);
add(cd,list);

system("PAUSE");
return 0;
}
Ecco provate a farli girare un secondo per capire cosa intendo. Poi un ultima cosa: come avete visto nell'ultima funzione aggiungo un record all'archivio, ma se a quel punto faccio ripartire il primo programma per caricare mi chiede solo tre recor e poi mi me ne mostra copiando il 3 nel 4, c'è modo di sviare l'inghippo?
Tha a lot

DanieleC88
15-05-2008, 19:58
for(i=0;i=!feof(list);i++)
Togli i= dalla condizione, lascia solo !feof(list).

stgww
15-05-2008, 20:07
Togli i= dalla condizione, lascia solo !feof(list).

Ok, grazie! Ora il primo problema l'ho risolto. Per quella storia che se per esempio: ho un record di 3, con la funzione add ne aggiungo uno, poi torno in carica e carico i tre record, ma il terzo appena immesso mi viene copiato nel 4, sai qualcosa ? Thx
EDIT: ho provato a cancellare il file bin contenente l'archivio e caricando i record con il primo programma (quindi 3 in totatle) mi appaiono ancora 4 record e il terzo mi viene copiato nel 4. Come mai?

DanieleC88
15-05-2008, 21:21
Non ho letto attentamente perché vado di fretta, ma secondo me il comportamento di edit_user() non è corretto: appena trovi il record giusto direi che puoi interrompere la lettura, quindi n diventa superflua e puoi dare un break invece di memorizzare l'indice e leggere fino alla fine. Inoltre, fseek() non è usata bene, avresti dovuto dare un:
fseek(list, n*sizeof(struct rec), SEEK_SET);
(dove n può essere sostituita direttamente con i se usi un break come ti ho consigliato)

Prova, magari risolve.

stgww
15-05-2008, 21:36
Non ho letto attentamente perché vado di fretta, ma secondo me il comportamento di edit_user() non è corretto: appena trovi il record giusto direi che puoi interrompere la lettura, quindi n diventa superflua e puoi dare un break invece di memorizzare l'indice e leggere fino alla fine. Inoltre, fseek() non è usata bene, avresti dovuto dare un:
fseek(list, n*sizeof(struct rec), SEEK_SET);
(dove n può essere sostituita direttamente con i se usi un break come ti ho consigliato)

Prova, magari risolve.

Grazie per l'ottimizzazione! Purtroppo non risolve il problema deve essere altrove...Cmq se non ha i tempo fa niente, magari se puoi me lo riguardi con calma domani.
Thx

stgww
16-05-2008, 19:20
Up per me !
Nessuno riesce a risolvere?

DanieleC88
16-05-2008, 20:14
Scusa ma la struct rec cd viene passata per copia alle funzioni che chiami dalla main()? Dovresti passare un puntatore, altrimenti come la modificano? Prova a stamparne i valori nella main() dopo averli letti, per verificare.