Salve a tutti ragazzi. Ultimamente sto cercando di capire per bene come lavorare sui file con il C++. Sto usando l'ambiente di lavoro Borland C++ Builder 6 sotto Win XP. Sono incappato però in un punto cieco per me.
Ho scritto un programmino per la gestione di un autosalone che scrive in un file ("car.dat") tutti i vari dati di ogni singola auto. Il programma al momento prevede l'inserimento di una nuova auto (una alla volta quindi) e la stampa di tutte le auto. Le operazione che vado a fare sul file "car.dat" sono la creazione ovviamente (e fin qui nessun problema, uso l'algoritmo per il controllo dell'esistenza del file evitando di farlo andare in errore), la scrittura e la lettura.
PROBLEMA: la cosa strana che riscontro è che quando vado ad inserire un nuovo record nel mio file, la scrittura non avviene correttamente. Uso gli attributi ios::app per fare in modo che ogni scrittura venga effettuata in fondo al file ma ciò non avviene e non capisco il perchè. Di seguito vi posto il codice dell'intero programmino sperando che qualche anima pia mi aiuti nello scopo. In grassetto ho evidenziato la procedura che dovrebbe scrivere sul file ma che in realta non lo fà...
Grazie anticipatamente a tutti!!
codice:
#include <stdio.h>
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>
//Costante Nome File
char NOMEF[]= "car.dat";
class cSalone;
class cAuto{
friend class cSalone;
private:
char targa[9];
short cil;
char alim;
float prezzo;
char marca[15];
char modello[15];
char isUsata;
public:
cAuto(){};
void caricaAuto();
void stampaAuto();
};
class cSalone{
private:
fstream fauto;
public:
cSalone();
void nuovaAuto();
void stampa();
};
cSalone S;
void main(){
char opt;
do{
clrscr();
cout << "I - Inserisci una nuova auto" << endl;
cout << "S - Stampa tutte le auto dell'autosalone" << endl;
cout << "F - Esci dal programma"<<endl;
opt = getche();
cout << endl;
opt = toupper(opt);
switch(opt){
case 'I':
S.nuovaAuto();
break;
case 'S':
S.stampa();
system("pause");
break;
default:
cout << "Hai scelto un opzione errata!!" << endl;
}
}while(opt!= 'F');
}
cSalone::cSalone(){
fauto.open(NOMEF,ios::in|ios::binary);
if(!fauto){
fauto.open(NOMEF,ios::out|ios::binary);
if (!fauto) cout << "errore";
}
fauto.close();
}
void cAuto::caricaAuto(){
fflush(stdin);
cout << "Inserisci la targa" << endl;
fflush(stdin);
gets(targa);
cout << "Inserisci la cilindrata" << endl;
fflush(stdin);
cin >> cil;
cout << "Inserisci l'alimentazione" << endl;
fflush(stdin);
cin >> alim;
cout << "Inserisci il prezzo" << endl;
fflush(stdin);
cin >> prezzo;
cout << "Inserisci la marca" << endl;
fflush(stdin);
gets(marca);
cout << "Inserisci il modello" << endl;
fflush(stdin);
gets(modello);
cout << "E' usata? (s/n)" << endl;
fflush(stdin);
cin >> isUsata;
fflush(stdin);
}
void cAuto::stampaAuto(){
cout << "TARGA: " << targa << endl;
cout << "CILINDRATA: " << cil << endl;
cout << "ALIMENTAZIONE: " << alim << endl;
cout << "PREZZO: " << prezzo << endl;
cout << "MARCA: " << marca << endl;
cout << "MODELLO: " << modello << endl;
cout << "USATA: " << isUsata << endl;
}
void cSalone::stampa(){
cAuto A;
fauto.open(NOMEF, ios::in|ios::binary);
while(fauto.read((char*)&A,sizeof(cAuto))!=0){
A.stampaAuto();
}
fauto.clear();
fauto.close();
}
void cSalone::nuovaAuto(){
cAuto A;
A.caricaAuto();
fauto.open(NOMEF, ios::app|ios::binary);
fauto.write((char*)(&A), sizeof(cAuto));
fauto.clear();
fauto.close();
}