|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
C++ & EOF
Salve ragazzi sto creando una procedura per modificare un file di struct.
Il while è composto da 2 condizioni fread(&rut,1,sizeof(rut), stream)>0 && tr==false quando utilizzo la condizione fread(&rut,1,sizeof(rut), stream)>0 mi capitano cose strane ad esempio trovo alla fine del file delle registrazioni duplicate che sovrascrivono delle altre registrazioni. esempio: Ho 4 registrazioni nel file, lancio la procedura, modifico la terza registrazione ,stampo il file e trovo un duplicato della seconda registrazione che si sovrappone alla quarta. Se abolisco questa condizione sostituendola ad esempio con un seplice contatore: k<=100 && tr==false la procedura funziona correttamente e non mi da questi problemi di duplicazione. Ultima cosa apro il file con r+ Grazie Ciao Ultima modifica di gio84 : 07-03-2005 alle 09:38. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Posta un esempio per riprodurre il comportamento.
nb nella fread devi invertire "1" e sizeof. Ti evita rogne se, per qualche errore, il file non è un multiplo della struttura che stai leggendo.
__________________
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: Jan 2005
Messaggi: 199
|
file dopo caricamento:
nome:giovanni cognome:rossi nome:fabio cognome:esposito nome:mario cognome:de luca nome:luigi cognome:meda ora cambieremo il nome a mario de luca(gli assegnerò il nome andrea)e otterremo: nome:giovanni cognome:rossi nome:fabio cognome:esposito nome:andrea cognome:de luca nome:fabio cognome:esposito ho provato anche ad invertire i due valori 1 e sizeof ma niente da fare... ho sempre lo stesso problema |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se modifichi il file a parteire da una certa posizione aggiungendo o diminuendo il numero di caratteri allora dovrai riscrivere anche le strutture successive a quella modificata...
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
ma perche' non posso modificare direttamente solo la registrazione che mi interessa??
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Se la quantità è superiore (le stringhe in modalità testo vengono scritte solo fino al carattere di fine stringa)... I dati in più vanno a sovrascrivere parte dei dati successivi facendone perdere il significato... |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
ho capito quello che dici, ma non è questo il mio problema,
riesco tranquillamente a modificare la registrazione ma non so perchè solo l'ultima registrazione mi viene sovrascritta totalmente |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
Secondo me il problema principale è il fseek mi esce anke 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 12:37. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Metti -(int)sizeof(rut)
|
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
x il warning avevo risolto assegnando la funzione sizeof ad una variabile intera.
Ma cmq ho sempre lo stesso problema... l'ultimo elemento del file mi viene sovrascritto Sicuramente il problema sta nella condizione del while perche' se metto : while ((fread(&rut,sizeof(rut),1,stream)>0) && (tr==false)) mi sovrascrive l'ultimo elemento se invece metto : while ((k<=100) && (tr==false)) funziona tutto perfettamente. Ma ovviamente non posso lasciare come condizione k<=100 Ultima modifica di gio84 : 09-03-2005 alle 09:33. |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
upp
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
prova con feof().
Codice PHP:
|
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
ora funziona
grazie ![]() |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
pregoz
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:35.