Ok allora, scusami tanto ma ho detto una sciocchezza prima.
Poi, non so se il codice che hai postato è del professore (spero proprio di no!) ma penso che non dovresti considerarlo assolutamente perchè contiene diversi errori logici.
Su un file ci puoi scrivere come vuoi tu, sovrascrivendo quello che c'era prima volendo.
Mettiamo che sul tuo file hai scritto "0 - 0 - 0" e vuoi metterci "10 - 10 - 10". Puoi tranquillamente. Pero, testualmente, "10" è più lungo di "0". Dunque sovrascrivi pure quello che c'è dopo, e perdi i dati.
Se vuoi fare quello che vuoi fare tu non puoi usare (com'è stato fatto nell'esempio del prof) file aperti in maniera testuale. Devi usare file binari, così le sue righe avranno dimensione fissa (nel tuo caso 3 campi int = 12byte sempre).
Codice PHP:
#include <iostream>
using namespace std;
int main() {
struct Data {
int giorno;
int mese;
int anno;
};
typedef struct Data DATA;
DATA data;
FILE* fpunt;
fpunt = fopen("prova.dat","wb");
for(int i = 0; i < 4; i++) {
data.giorno = i;
data.mese = i;
data.anno = i;
fwrite (&data,sizeof(DATA),1,fpunt);
}
fclose(fpunt);
fpunt = fopen("prova.dat","rb");
while(fread(&data, sizeof(DATA), 1, fpunt) && !feof(fpunt)){
cout << data.giorno << " - " << data.mese << " - " << data.anno << endl;
}
fclose(fpunt);
int anno;
int nrec = 0;
cout << "Anno: ";
cin >> anno;
fpunt = fopen("prova.dat", "rb");
while(fread(&data, sizeof(DATA), 1, fpunt) && !feof(fpunt))
{
if(data.anno == anno)
{
cout << "Data trovata, nrec = " << nrec << endl;
break; //<- 1
}
nrec++; //<- 2
}
cout << "Nuovo giorno: ";
cin >> data.giorno;
cout << "Nuovo mese: ";
cin >> data.mese;
cout << "Nuovo anno: ";
cin >> data.anno;
fpunt = fopen("prova.dat", "r+b");
fseek(fpunt, sizeof(DATA)*nrec, SEEK_CUR); //<-3
fwrite(&data, sizeof(DATA), 1, fpunt);
fclose(fpunt);
cout << endl << endl;
fpunt = fopen("prova.dat","rb");
while(fread(&data, sizeof(DATA), 1, fpunt) && !feof(fpunt)){
cout << data.giorno << " - " << data.mese << " - " << data.anno << endl;
}
fclose(fpunt);
return 0;
}
Nota in (1) l'istruzione break (se lo trovo, non continuo a ciclare! devo fermarmi, altrimenti scorro tutto il file e scrivo sempre alla fine, come accadave nel sorgente del prof).
La break non basta, (2) nrec++ va DOPO il test data.anno == anno, altrimenti, supponi come input anno = 0. entri nel while, fai nrec++, il test dell'if restituisce 1, avviene la break.
Tu successivamente salti nrec = 1 campi, cioè salti giusto la linea che devi modificare, modificando la successiva.
Nota infine tutte le "b" aggiunte nell'apertura del file, per denotare la modalità binaria.
Un'ultima cosa, non scrivere codice come quello del solito esempio:
Codice PHP:
if((fp=fopen("PrimoAn.dat","r"))==NULL) {
cout<<"Il file non esiste"<<endl;
}
while(fread(&studente,sizeof(studente),1,fp) && !feof(fp)){
/* ... */
}
non ha senso. Ti accorgi che l'apertura non è andata a buon fine e continuo lo stesso ad operarci su? Devi gestire la situazione:
Codice PHP:
#include <iostream>
using namespace std;
int main() {
FILE* fp;
if ( (fp = fopen("nonce", "r")) == NULL)
{
cerr << "Errore" << endl;
return 1;
}
else
{
fclose(fp);
}
return 0;
}
per farti un esempio banale.
edit: dimenticavo, ora sai esattamente dove andare quando devi scrivere quindi questo:
Codice PHP:
DATA temp;
for(int i = 0; i < nrec; i++)
{
fread(&temp, sizeof(DATA), 1, fpunt);
}
fseek(fpunt, 0, SEEK_CUR);
diventa inutile, l'ho quindi rimpiazzato con
Codice PHP:
fseek(fpunt, sizeof(DATA)*nrec, SEEK_CUR);