PDA

View Full Version : C++ & EOF


gio84
07-03-2005, 09:29
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.

gio84
07-03-2005, 11:56
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

cionci
07-03-2005, 14:53
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...

gio84
07-03-2005, 15:44
ma perche' non posso modificare direttamente solo la registrazione che mi interessa??

cionci
07-03-2005, 16:07
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...

gio84
07-03-2005, 16:10
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

gio84
08-03-2005, 12:34
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);
}

cionci
09-03-2005, 08:12
Metti -(int)sizeof(rut)

gio84
09-03-2005, 09:24
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

gio84
11-03-2005, 07:54
upp

The3DProgrammer
11-03-2005, 14:40
prova con feof().



while(!feof(stream) && !tr){


fread(&rut,sizeof(rut),1,stream);


...


}

gio84
11-03-2005, 16:18
ora funziona
grazie:D

The3DProgrammer
11-03-2005, 19:42
pregoz ;)