PDA

View Full Version : [C++] File binari...


>|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à :)

wingman87
05-05-2007, 13:36
Non sono sicuro però prova a fare un flush prima di spostarti

>|HaRRyFocKer|
05-05-2007, 14:30
Non sono sicuro però prova a fare un flush prima di spostarti

Vale a dire...? :D

wingman87
05-05-2007, 14:39
Fai un file.flush() prima di spostarti, non sono sicuro che sia quello il problema comunque...
Il flush serve a svuotare il buffer e a scrivere sul file. La stessa cosa avviene automaticamente quando chiudi il file

skerdz
05-05-2007, 14:50
Se ho capito bele il codice, è strana la cosa che fai, perchè te scrivi sul file ma leggi direttamente dalla struttura, è per quello che al riavvio del programma non trova più niente.

Daniel

>|HaRRyFocKer|
05-05-2007, 17:05
No in realtà leggo anche dal file... Altrimenti non potrei leggere più di una "persona"...

skerdz
05-05-2007, 22:27
Se fai in quel modo dovresti chiamare una funzione all'inizio che preleva i dati dal file e li ri-inserisce nelle strutture.