PDA

View Full Version : Problema fseek


gio84
08-03-2005, 18:55
Come ho spiegato nel precedente post (c++ & EOF) quando tendo di modificare un file di struct alcune registrazioni vengono sovrapposte da dei duplicati.
Secondo me il problema principale è il (fread(&rut,sizeof(rut),1, stream)>0). Poi quando compilo esce anche questo warning per il segno "-" d'avanti sizeof:
"warning C4146: unary minus operator applied to unsigned type, result still unsigned"

ora vi posto l'intero codice:

FILE *stream = fopen("text.txt","r+");

printf("Inserisci il Cogome ");
gets(cogn);
printf("Inserisci il Nome ");
gets(nom);
while ((fread(&rut,sizeof(rut),1, stream)>0) && (tr==false))
{
if ((strcmp(rut.cognome,cogn)==0) && (strcmp(rut.nome,nom)==0)) ì
{
tr=true;
cout<<endl;
cout<<endl;
cout<<"Cognome "<<rut.cognome<<" ";
cout<<"Nome "<<rut.nome<<" ";
cout<<"Telefono "<<rut.num<<" ";
cout<<"Cellulare"<<rut.cell<<" ";
cout<<"Via/Piazza "<<rut.indirizzo.indiri;
cout<<" num "<<rut.indirizzo.n<<endl;

printf("Vuoi modificare questa Id? s/n");
gets(x);
if(x[0]=='s') {
cout<<"Cosa vuoi modificare?"<<endl;
cout<<"(1)Cognome,(2)Nome,(3)Telefono,(4)Cellulare,(5)Indirizzo,(6)civico,(0)Esci"<<endl;
cin>>h;
switch (h)
{
case 1:
{
printf("Inserisci Cognome ");
gets(rut.cognome);

break;
}
case 2:
{
printf("Inserisci Nome ");
gets(rut.nome);
break;
}
case 3:
{
printf("Inserisci Numero ");
gets(rut.num);
break;
}
case 5:
{
printf("Inserisci Indirizzo");
gets(rut.indirizzo.indiri);
break;
}
case 6:
{
printf("Inserisci civico");
gets(rut.indirizzo.n);
break;
}
case 4:
{
printf("Inserisci Cellulare");
gets(rut.cell);
break;
}
default:
if(h<0 || h>6)
{
cout<<endl;
cout<<"Inserisci un valore compreso tra 0 e 6"<<endl;
cout<<endl;
}

}
fseek(stream,-sizeof(rut),SEEK_CUR);
fwrite(&rut,sizeof(rut),1,stream);
}//chiude il secondo if che individua l'id

}//chiude il primo if che verifica se si vuole modificare o meno l'id


}//chiude il while

fflush(stream);
fclose(stream);
}

ilsensine
09-03-2005, 17:30
Originariamente inviato da gio84
"warning C4146: unary minus operator applied to unsigned type, result still unsigned"

Questo lo elimini con un cast:
fseek(stream,-(int)sizeof(rut),SEEK_CUR);

bottomap
09-03-2005, 19:11
Ciao,
Due considerazioni:

1) Come dice ilsensine puoi evitare la warning sulla sizeof... sarebbe comunque più opportuno castarlo a long piuttosto che a int (fseek si aspetta proprio un long).

2) Non riesco comunque a capire il motivo di una seek all'indietro rispetto al current... istruzioni simili sono sempre convertibili in maniera migliore con una seek assoluta ad (i*sizeof())... sempre meglio usare la seconda forma anche per evitare alcuni problemi aggiuntivi.

3) Il discorso dei duplicati può derivare da un uso errato delle fseek... ricorda comunque che sizeof(struttura) non è detto sia effettivamente la somma della dimensione dei suoi campi... la grandezza di una struct è in genere allineata ad un certo limite che dipende dal compilatore (sotto MSVC sono 8 byte).

Ciaociao :)