>|HaRRyFocKer|
05-05-2007, 12:40
Allora miei cari, ho fatto per l'università un programmino che si basa sull'uso di un file binario e di strutture... Ora il prof ci ha detto che una volta chiuso il programma, alla seconda esecuzione i dati all'interno del file sono ancora utilizzabili... ora io nell'apertura del file ho fatto
fstream file;
file.open("file.dat",ios::binary|ios::in|ios::out|ios::ate);
e questo dovrebbe significare che il file è aperto in input e output e che entrambi i cursori (di lettura e scrittura si sarebbero trovati alla fine del file). Ora però, quando io attraverso la linea di comando
file.seekg(0,ios::beg);
dovrei teoricamente portare il cursore all'inizio del file, i dati precedentemente inseriti non me li stampa.
Qual'è il problema...? Cos'è che il mio prof non mi ha detto...? :D
In definitiva il codice è questo:
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
struct anagrafica{
short int giorno;
short int mese;
short int anno;
char luogo[50];
};
struct Dati{
short nprog;
char nome[30];
char cognome[50];
char telefono[12];
anagrafica fica;
};
short int contatore;
const int lunghezza=sizeof(Dati);
short menu();
void InsertData(Dati&,fstream&);
void stampatutto(Dati&,fstream&);
void ricerca(Dati&,fstream&);
void stampapersona(Dati&);
int main(){
fstream file;
file.open("file.dat",ios::in|ios::out|ios::binary);
if (!file){
file.open("file.dat",ios::in|ios::out|ios::binary|ios::trunc);
cout<<"File creato! Riavviare l'applicazione. ";
return 0;
}
short scelta;
Dati persona;
do {
scelta=menu();
if (scelta==1){
InsertData(persona,file);
}
if (scelta==2)
stampatutto(persona,file);
if (scelta==3)
ricerca(persona,file);
}
while (scelta>0 && scelta<4);
file.close();
return 0;
}
void stampapersona(Dati &persona){
cout<<"N° "<<persona.nprog<<endl<<persona.nome<<" "<<persona.cognome<<endl;
cout<<"Nato a "<<persona.fica.luogo<<" in data "<<persona.fica.giorno<<"/";
cout<<persona.fica.mese<<"/"<<persona.fica.anno<<"\nNumero di telefono: ";
cout<<persona.telefono;
}
short menu(){
short choice;
cout<<"Inserisci la tua scelta: 1 per inserire,2 per stampare tutto, 3 per cercare un cognome: ";
cin>>choice;
return choice;
}
void InsertData (Dati &persona,fstream &file){
char ch;
do {
file.seekp(0,ios::end);
contatore++;
persona.nprog=contatore;
cout<<"Inserisci nome e cognome separati da spazi: ";
cin>>persona.nome>>persona.cognome;
cout<<"\nInserisci ora il numero di telefono: ";
cin>>persona.telefono;
cout<<"\nInserisci ora la tua data di nascita nel formato gg mm aaaa";
cin>>persona.fica.giorno>>persona.fica.mese>>persona.fica.anno;
cout<<"\nInserisci ora il comune di nascita";
cin>>persona.fica.luogo;
cout<<"\nVuoi inserire un nuovo nominativo? y oppure n?: ";
file.write((char*)&persona,lunghezza);
cin>>ch;
}
while (ch=='y');
}
void stampatutto(Dati &persona,fstream &file){
file.seekg(0,ios::beg);
for (int i=0;i<contatore;i++){
file.read((char*) &persona,lunghezza);
stampapersona(persona);
}
}
void ricerca(Dati &persona,fstream &file){
file.seekg(0,ios::beg);
char nomescelto[50],temp[50];
cout<<"\nInserire il cognome desiderato: ";
cin>>nomescelto;
for (int i=0;i<contatore;i++){
file.read((char*) &persona,lunghezza);
if (strcmp(persona.cognome,nomescelto)==0)
stampapersona(persona);
}
}
Grazie a chi mi aiuterà :)
fstream file;
file.open("file.dat",ios::binary|ios::in|ios::out|ios::ate);
e questo dovrebbe significare che il file è aperto in input e output e che entrambi i cursori (di lettura e scrittura si sarebbero trovati alla fine del file). Ora però, quando io attraverso la linea di comando
file.seekg(0,ios::beg);
dovrei teoricamente portare il cursore all'inizio del file, i dati precedentemente inseriti non me li stampa.
Qual'è il problema...? Cos'è che il mio prof non mi ha detto...? :D
In definitiva il codice è questo:
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
struct anagrafica{
short int giorno;
short int mese;
short int anno;
char luogo[50];
};
struct Dati{
short nprog;
char nome[30];
char cognome[50];
char telefono[12];
anagrafica fica;
};
short int contatore;
const int lunghezza=sizeof(Dati);
short menu();
void InsertData(Dati&,fstream&);
void stampatutto(Dati&,fstream&);
void ricerca(Dati&,fstream&);
void stampapersona(Dati&);
int main(){
fstream file;
file.open("file.dat",ios::in|ios::out|ios::binary);
if (!file){
file.open("file.dat",ios::in|ios::out|ios::binary|ios::trunc);
cout<<"File creato! Riavviare l'applicazione. ";
return 0;
}
short scelta;
Dati persona;
do {
scelta=menu();
if (scelta==1){
InsertData(persona,file);
}
if (scelta==2)
stampatutto(persona,file);
if (scelta==3)
ricerca(persona,file);
}
while (scelta>0 && scelta<4);
file.close();
return 0;
}
void stampapersona(Dati &persona){
cout<<"N° "<<persona.nprog<<endl<<persona.nome<<" "<<persona.cognome<<endl;
cout<<"Nato a "<<persona.fica.luogo<<" in data "<<persona.fica.giorno<<"/";
cout<<persona.fica.mese<<"/"<<persona.fica.anno<<"\nNumero di telefono: ";
cout<<persona.telefono;
}
short menu(){
short choice;
cout<<"Inserisci la tua scelta: 1 per inserire,2 per stampare tutto, 3 per cercare un cognome: ";
cin>>choice;
return choice;
}
void InsertData (Dati &persona,fstream &file){
char ch;
do {
file.seekp(0,ios::end);
contatore++;
persona.nprog=contatore;
cout<<"Inserisci nome e cognome separati da spazi: ";
cin>>persona.nome>>persona.cognome;
cout<<"\nInserisci ora il numero di telefono: ";
cin>>persona.telefono;
cout<<"\nInserisci ora la tua data di nascita nel formato gg mm aaaa";
cin>>persona.fica.giorno>>persona.fica.mese>>persona.fica.anno;
cout<<"\nInserisci ora il comune di nascita";
cin>>persona.fica.luogo;
cout<<"\nVuoi inserire un nuovo nominativo? y oppure n?: ";
file.write((char*)&persona,lunghezza);
cin>>ch;
}
while (ch=='y');
}
void stampatutto(Dati &persona,fstream &file){
file.seekg(0,ios::beg);
for (int i=0;i<contatore;i++){
file.read((char*) &persona,lunghezza);
stampapersona(persona);
}
}
void ricerca(Dati &persona,fstream &file){
file.seekg(0,ios::beg);
char nomescelto[50],temp[50];
cout<<"\nInserire il cognome desiderato: ";
cin>>nomescelto;
for (int i=0;i<contatore;i++){
file.read((char*) &persona,lunghezza);
if (strcmp(persona.cognome,nomescelto)==0)
stampapersona(persona);
}
}
Grazie a chi mi aiuterà :)