PDA

View Full Version : [c++] salvare dati: problemi...


lucas72
02-05-2004, 15:47
Non riesco a capire perchè il codice sotto non si compila.
Voglio salvare i dati che inserisco nella struttura, ma ricevo un sacco di messaggi di errore dal compilatore (soprattutto su string di leggiFile)
chi mi aiuta?



#include <iostream.h>
#include <iomanip>
#include <fstream>
#include <string>
const int FALSO = 0;
const int VERO = 1;
struct Data
{ int giorno, // 1-31
mese, // 1-12
anno; // 00-99
};
const int MAXIDENT =10;
struct Studente
{ int matricola;
char cognome[MAXIDENT],
nome[MAXIDENT],
sesso; // M,F
Data dataNascita;
};
const int DIM = 8;
struct InsStudenti
{ int num; // numero di righe significative
Studente elenco[DIM];
};

InsStudenti inizializzaTabella();
void inserisciSeNonEsiste(Studente, InsStudenti &);
void eliminaSeEsiste(int,InsStudenti &);
void cercaSeEsisteEPosizione(int, InsStudenti &,int &, int &);
void stampaTabella(InsStudenti &);
void leggiNomeFile(string &nomeFile);
void salvastud (InsStudenti &classe, string &nomeFile);

int main()
{
string nomeFile;
const char INSERISCI = 'i';
const char ELIMINA = 'e';
const char FINE = 'f';
const char SALVA = 's';
const char CARICA = 'c';
char operazione ; // operazione da effettuare sulla tabella
Studente nuovoStudente; // dati dello studente da inserire
int matricola; // matricola dello studente da eliminare
InsStudenti classe;
classe = inizializzaTabella();
stampaTabella(classe);
cout << setw(50) << "acquisizione operazioni" << endl << endl;
cout << "operazione? (i per inserimento,"
<< " e per eliminazione,"
<< " s per salva ,"<<endl
<< " c per carica ,"
<< " f per fine" << "): ";
cin >> operazione;
while (operazione != FINE)
{ if (operazione == INSERISCI)
{ //lettura dei dati del nuovo studente
cout << " dati del nuovo studente" << endl;
cout << " matricola: "; cin >> nuovoStudente.matricola;
cout << " cognome: "; cin >> nuovoStudente.cognome;
cout << " nome: "; cin >> nuovoStudente.nome;
cout << " sesso( M/F ): "; cin >> nuovoStudente.sesso;
cout << " giorno di nascita (1-31): ";
cin >> nuovoStudente.dataNascita.giorno;
cout << " mese di nascita (1-12): ";
cin >> nuovoStudente.dataNascita.mese;
cout << " anno di nascita (0-99): ";
cin >> nuovoStudente.dataNascita.anno;
inserisciSeNonEsiste(nuovoStudente,classe);
stampaTabella(classe);
}
else if (operazione == ELIMINA)
{ //lettura matricola studente da eliminare
cout << " matricola studente da eliminare: ";
cin >> matricola;
eliminaSeEsiste(matricola,classe);
stampaTabella(classe);
}
else if (operazione == SALVA)
{
leggiNomeFile(nomeFile);
salvastud (classe, nomeFile);
}
cout << "operazione? (i per inserimento,"
<< " e per eliminazione,"
<< " s per salva ,"<<endl
<< " c per carica ,"
<< " f per fine" << "): ";
cin >> operazione;
}
system ("PAUSE");
return 0;

}
InsStudenti inizializzaTabella()
{
InsStudenti tab =
{
4,
{{7, " rossi", " marco",'M',{5,10,76}},
{48," verdi", " anna", 'F',{4, 7,75}},
{63," neri", " remo", 'M',{5, 8,76}},
{84," gialli"," carla",'F',{5,11,75}}
}
};
return tab;
}
void cercaSeEsisteEPosizione(int dato, InsStudenti &tab,
int &esiste, int &pos)
{
esiste = FALSO;/
if ((tab.num == 0) || // tabella vuota
(tab.elenco[0].matricola > dato))
pos = -1;
//caso speciale di studente esistente in prima posizione
else if (tab.elenco[0].matricola == dato)
{ esiste = VERO;
pos = -1;
}
else
{ pos = 0; // si parte dal primo elemento
int finito = FALSO; // finché non è finita la ricerca
while (finito == FALSO) // si esamina il successore di pos:
{ if (pos == tab.num -1) // non esiste successore
finito = VERO;
else if (tab.elenco[pos+1].matricola == dato)
{ finito = VERO; // l'elemento cercato
esiste = VERO; // è quello successivo a pos
}
else if (tab.elenco[pos+1].matricola > dato)
finito = VERO; // l'elemento cercato non esiste
else
pos++;
}
}

}
void leggiNomeFile (string &nomeFile)
{
int scelta;
if (nomeFile != ""){
cout << "Utilizzare il file " << nomeFile << "?" << endl;
cout << "1. SI " << endl;
cout << "2. No, specifico un altro file"<< endl;
cout << "-------------------------------" << endl;
cin >> scelta;
while ((scelta < 1) || (scelta > 2)){
cout << "Scelta scorretta" << endl;
cin >> scelta;
}
if (scelta == 2){
cin.ignore();
cout << "Inserisci il file dov'e' contenuta la rubrica" << endl;
getline (cin, nomeFile);
}
} else {
cin.ignore();
cout << "Inserisci il file dov'e' contenuta la rubrica" << endl;
getline (cin, nomeFile);
}
return;
}

void salvastud(InsStudenti &classe, string &nomeFile){
int i;
ofstream scriviFile (nomeFile.c_str());
if (classe.num == 0){
}
for (i=0; i < rubrica.index; i++){
scriviFile << classe.elenco[i].cognome << endl;
scriviFile << classe.elenco[i].nome << endl;
scriviFile << classe.elenco[i].sesso<< endl;
//qui per salvare anche la data come faccio?? grazie
//va bene: scriviFile << classe.elenco[i].dataNascita.giorno?
//ecc ecc
}
scriviFile.close();
return;
}
void inserisciSeNonEsiste(Studente nuovoStudente, InsStudenti &tab)
{
int esiste, posizione;
cercaSeEsisteEPosizione(nuovoStudente.matricola, tab, esiste, posizione);
if ((esiste == FALSO) && (tab.num <= DIM))
{ cout << "inserimento di studente con matricola"
<< setw(5) << nuovoStudente.matricola << endl;
int temp = posizione + 1;
for (int i = tab.num - 1; i >= temp; i--)
tab.elenco[i + 1] = tab.elenco[i];
tab.elenco[temp] = nuovoStudente;
tab.num++;
}
}
void eliminaSeEsiste(int matricola, InsStudenti &tab)
{
int esiste, posizione;
cercaSeEsisteEPosizione(matricola, tab, esiste, posizione);
if (esiste == VERO)
{ cout << "eliminazione di studente con matricola"
<< setw(5) << matricola << endl;
int temp = posizione + 1; //posizione dell'elemento da eliminare
for (int i = temp + 1; i < tab.num; i++)
tab.elenco[i - 1] = tab.elenco[i];
tab.num--;
}
}
void stampaTabella(InsStudenti &tab)
{
int i;
cout << " tabella con il solo campo chiave " << endl<<endl;
for(i = 0; i< tab.num; i++){
cout << setw(5) << tab.elenco[i].matricola;
cout << setw(5) << tab.elenco[i].cognome;
cout << setw(5) << tab.elenco[i].nome;
cout<<endl;
}
cout << endl << endl;
}

cionci
02-05-2004, 18:35
Intanto questo:

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>

using namespace std;

Ma quante righe hai scritto prima di compialre la prima volta ?

lucas72
03-05-2004, 21:04
[QUOTE
Ma quante righe hai scritto prima di compialre la prima volta ? [/QUOTE]


?????
:rolleyes: :confused:

cionci
03-05-2004, 21:47
Il programma lo compili la prima volta quando hai finito di scriverlo ? Solitamente si compila molto spesso mentre si scrive il codice...pezzo per pezzo...

cavay
10-05-2004, 02:24
se non riporti gli errori....è difficile capire...poi sono errori di compilazione o di link?