View Full Version : 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
ilsensine
07-03-2005, 11:18
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.
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
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...
ma perche' non posso modificare direttamente solo la registrazione che mi interessa??
Originariamente inviato da gio84
ma perche' non posso modificare direttamente solo la registrazione che mi interessa??
Puoi modificarla ma solo con una quantità di dati pari alla precedente...
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...
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
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);
}
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
The3DProgrammer
11-03-2005, 14:40
prova con feof().
while(!feof(stream) && !tr){
fread(&rut,sizeof(rut),1,stream);
...
}
The3DProgrammer
11-03-2005, 19:42
pregoz ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.