|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
Problema fseek
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); } Ultima modifica di gio84 : 08-03-2005 alle 19:20. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Re: Problema fseek
Quote:
fseek(stream,-(int)sizeof(rut),SEEK_CUR);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Feb 2005
Città: Prato
Messaggi: 149
|
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 ![]()
__________________
Venite a visitarci qui:http://www.bottomap.com Bottomap is a proud Masterdrive.it moderator |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:07.