Precedente :: Successivo |
Autore |
Messaggio |
WeBBeR Mortale devoto
Registrato: 23/04/07 23:25 Messaggi: 5
|
Inviato: 23 Apr 2007 23:33 Oggetto: * [C++] File e strutture dinamiche |
|
|
Ho un problema con il c++ ora vi spiego.. in pratica devo creare un programma che gestisce un concessionario.. e fin qui tutto ok, per devo fare in modo che i dati vengano salvati all'interno di un file...e fin qui ci siamo... all'apertura del programma pero devo trasferire i dati dalla dal file alla struttura dinamica e qui nascono i problemi... vi posto il codice cosi potete dirmi dov'è che sbaglio.. grazie in anticipo
Codice: |
#include <iostream>
#include <stdlib.h>
#include <string>
#include <fstream>
using namespace std;
struct dinamic {
string modello;
string marca;
string note;
int prezzo;
dinamic* next;
};
dinamic* primo;
void crea ();
void stampa ();
void dinamistatic ();
void staticdinamic ();
int main()
{
int sce;
staticdinamic ();
inizio:
cout<<"1. crea "<<endl;
cout<<"2. stampa "<<endl;
cout<<"3. esci "<<endl;
cin>>sce;
if (sce == 1) { crea(); goto inizio; }
else if (sce == 2) { stampa(); goto inizio; }
dinamistatic ();
system("PAUSE");
return 0;
}
void crea () {
cin.clear();
cin.ignore(1,'\n');
primo = NULL;
int a=1;
dinamic* p;
while (a != 0) {
p = new dinamic;
cout<<"Inserisci il modello: ";
getline(cin,p->modello);
cout<<"Inserisci il marca: ";
getline(cin,p->marca);
cout<<"Inserisci delle note particolari: ";
getline(cin,p->note);
cout<<"Inserisci prezzo in ?: ";
cin>>p->prezzo;
p->next = primo;
primo = p;
cout<<"0 per terminare l'inserimento"<<endl;
cin>>a;
cin.clear();
cin.ignore(1,'\n');
}
}
void stampa () {
dinamic* p;
p = primo;
while (p != NULL) {
cout<<"Modello: "<<p->modello<<endl;
cout<<"Marca: "<<p->marca<<endl;
cout<<"Note: "<<p->note<<endl;
cout<<"Prezzo: "<<p->prezzo<<endl;
p = p->next;
}
}
void dinamistatic () {
string conc;
dinamic* p;
char carter = 126;
p = primo;
ofstream conces("concess.txt");
while (p != NULL) {
conces<<p->modello<<endl;
conces<<p->marca<<endl;
conces<<p->note<<endl;
conces<<p->prezzo<<endl;
conces<<carter<<endl;
p = p->next;
}
conces.close();
}
void staticdinamic () {
string conc;
int a=0,A=0;
dinamic* p;
primo = NULL;
char conv[30];
ifstream conces("concess.txt");
while (!conces.eof()) {
if (a == 0) {
p = new dinamic;
getline(conces,conc);
p->modello = conc;
a++;
}
if (a == 1) {
getline(conces,conc);
p->marca = conc;
a++;
}
if (a == 2) {
getline(conces,conc);
p->note = conc;
a++;
}
if (a == 3) {
strcpy(conv,conc.c_str());
A = atoi(conv);
p->prezzo = A;
a++;
}
if (a == 4) {
p->next = primo;
primo = p;
a = 0;
}
}
conces.close();
}
|
se provo a fare la stampa appena apro il programma mi da questo
Codice: |
Modello: ~
Marca:~
Note:~
Prezzo:0
Modello:Ferrari
Marca:La piu bella
Note:1000000
Prezzo:1000000
Modello:30000
Marca:~
Note:Enzo
Prezzo:0
Modello:A3
Marca:Audi
Note:Una delle migliori
Prezzo:0
|
nel file avevo questa situazione
Codice: |
A3
Audi
Una delle migliori
30000
~
Enzo
Ferrari
La piu bella
1000000
~
|
il ~ lo uso come carattere terminatore che mi serve a farmi capire dove inizia l'altra auto.
Il problema sta sicuramente nella funzione staticdinamic ma nn so come risolvere. |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11594 Residenza: Tokelau
|
Inviato: 24 Apr 2007 11:38 Oggetto: |
|
|
credo che il problema stia da queste parti:
Codice: | if (a == 0) {
p = new dinamic;
getline(conces,conc);
p->modello = conc;
a++;
}
if (a == 1) {
getline(conces,conc);
p->marca = conc;
a++;
}
if (a == 2) {
getline(conces,conc);
p->note = conc;
a++;
}
if (a == 3) {
strcpy(conv,conc.c_str());
A = atoi(conv);
p->prezzo = A;
a++;
}
if (a == 4) {
p->next = primo;
primo = p;
a = 0;
}
|
o comunque è curioso che fai delle if dentro le quali incrementi la variabile su cui fai -e rifai- le if ...
piuttosto fai:
Codice: | p = new dinamic;
getline(conces,conc);
p->modello = conc;
getline(conces,conc);
p->marca = conc;
getline(conces,conc);
p->note = conc;
strcpy(conv,conc.c_str());
A = atoi(conv);
p->prezzo = A;
p->next = primo;
primo = p;
|
tutto in un blocco... ma mi sembra comunque che manchi ancora un getline()... |
|
Top |
|
|
WeBBeR Mortale devoto
Registrato: 23/04/07 23:25 Messaggi: 5
|
Inviato: 24 Apr 2007 11:59 Oggetto: |
|
|
Anche se faccio cosi come dici tu ho lo stesso risultato di prima |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11594 Residenza: Tokelau
|
Inviato: 24 Apr 2007 14:02 Oggetto: |
|
|
ma la getline() mancante l'hai aggiunta?
e adesso che noto, se hai una linea che contiene solo ~ per indicare che è "finita l'auto", quando leggi questa riga? non lo fai, mi sembra...
Codice: | if (a == 2) {
getline(conces,conc);
p->note = conc;
a++;
}
if (a == 3) {
getline(conces,conc); // <--- questa manca!
strcpy(conv,conc.c_str());
A = atoi(conv);
p->prezzo = A;
a++;
}
if (a == 4) {
getline(conces,conc); // <--- e qui devi leggere ~, no?
p->next = primo;
primo = p;
a = 0; |
|
|
Top |
|
|
Crono Semidio
Registrato: 24/03/05 14:12 Messaggi: 224 Residenza: Trieste
|
Inviato: 24 Apr 2007 15:11 Oggetto: |
|
|
Non sono mai riuscito a leggere correttamente gli oggetti string da file e perciò uso gli array di caratteri con terminatore null quando ho a che fare con loro |
|
Top |
|
|
WeBBeR Mortale devoto
Registrato: 23/04/07 23:25 Messaggi: 5
|
Inviato: 24 Apr 2007 15:11 Oggetto: |
|
|
Si grazie ho risolto, ho letto il ~ e messo le getline(), inizialmente nn le avevo messe dato che dovevo solamente leggere un valore numerico quindi difficilmente c sono spazi ma nn so xkè cosi stampa male cosi ho fatto come dici tu e funziona. grazie |
|
Top |
|
|
Crono Semidio
Registrato: 24/03/05 14:12 Messaggi: 224 Residenza: Trieste
|
Inviato: 24 Apr 2007 16:36 Oggetto: |
|
|
Io avevo pensato a questa soluzione che utilizza il container list (che è una lista bidirezionale) definito dalla standard template library
Codice: | #include<iostream>
#include<string>
#include<fstream>
#include<conio>
#include<list>
using namespace std;
struct dinamic {
string modello, marca, note;
int prezzo;
dinamic() {prezzo=0;}
};
void crea(list<dinamic> &lst);
void stampa(list<dinamic> &lst);
void salva(list<dinamic> &lst);
void apri(list<dinamic> &lst);
void main() {
int sce;
list<dinamic> lst;
apri(lst);
for(;;) {
clrscr();
cout<<"1. crea "<<endl;
cout<<"2. stampa "<<endl;
cout<<"3. esci "<<endl;
cin>>sce;
switch (sce) {
case 1: crea(lst);
break;
case 2: stampa(lst);
break;
case 3: salva(lst);
return;
default: break;
}
}
}
void crea(list<dinamic> &lst) {
char a=NULL;
dinamic din;
clrscr();
while(a!='0') {
cout<<"Inserisci il modello: ";
getline(cin, din.modello);
//[mistero della fede]
din.modello.clear(); //non chiedetemi a cosa servono queste due linee perchè non lo so nemmeno io ma senza
getline(cin, din.modello); //di esse non c'è modo di assegnare un valore a din.modello
//[/mistero della fede]
cout<<"Inserisci la marca: ";
getline(cin, din.marca);
cout<<"Inserisci delle note particolari: ";
getline(cin, din.note);
cout<<"Inserisci prezzo in euro: ";
cin>>din.prezzo;
lst.push_back(din);
cout<<"0 per terminare l'inserimento"<<endl;
a=getch();
}
}
void stampa(list<dinamic> &lst) {
if(lst.empty()) return;
clrscr();
for(list<dinamic>::iterator i=lst.begin(); i!=lst.end(); i++) {
cout<<i->modello<<endl;
cout<<i->marca<<endl;
cout<<i->note<<endl;
cout<<i->prezzo<<endl;
}
getch();
}
void salva(list<dinamic> &lst) {
char modello[251], marca[251], note[251];
fstream file;
file.open("concess.txt", ios::out|ios::binary);
for(list<dinamic>::iterator i=lst.begin(); i!=lst.end(); i++) {
for(int j=0; j<251; j++) modello[j]=i->modello[j];
file.write(reinterpret_cast<char *>(&modello), sizeof modello);
for(int j=0; j<251; j++) marca[j]=i->marca[j];
file.write(reinterpret_cast<char *>(&marca), sizeof marca);
for(int j=0; j<251; j++) note[j]=i->note[j];
file.write(reinterpret_cast<char *>(¬e), sizeof note);
file.write(reinterpret_cast<char *>(&(i->prezzo)), sizeof i->prezzo);
}
file.close();
}
void apri(list<dinamic> &lst) {
fstream file;
file.open("concess.txt", ios::in|ios::binary);
if(!file) {file.close(); return;}
char modello[251], marca[251], note[251];
for(int i=0; i<251; i++) modello[i]=marca[i]=note[i]=NULL;
dinamic din;
while(!file.eof()) {
file.read(reinterpret_cast<char *>(&modello), sizeof modello);
din.modello=modello;
file.read(reinterpret_cast<char *>(&marca), sizeof marca);
din.marca=marca;
file.read(reinterpret_cast<char *>(¬e), sizeof note);
din.note=note;
file.read(reinterpret_cast<char *>(&din.prezzo), sizeof din.prezzo);
lst.push_back(din);
}
file.close();
lst.pop_back();
} |
|
|
Top |
|
|
|
|
Non puoi inserire nuovi argomenti Non puoi rispondere a nessun argomento Non puoi modificare i tuoi messaggi Non puoi cancellare i tuoi messaggi Non puoi votare nei sondaggi
|
|