Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
* [C++] File e strutture dinamiche
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
WeBBeR
Mortale devoto
Mortale devoto


Registrato: 23/04/07 23:25
Messaggi: 5

MessaggioInviato: 23 Apr 2007 23:33    Oggetto: * [C++] File e strutture dinamiche Rispondi citando

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
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11558
Residenza: Tokelau

MessaggioInviato: 24 Apr 2007 11:38    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato HomePage
WeBBeR
Mortale devoto
Mortale devoto


Registrato: 23/04/07 23:25
Messaggi: 5

MessaggioInviato: 24 Apr 2007 11:59    Oggetto: Rispondi citando

Anche se faccio cosi come dici tu ho lo stesso risultato di prima
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11558
Residenza: Tokelau

MessaggioInviato: 24 Apr 2007 14:02    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato HomePage
Crono
Semidio
Semidio


Registrato: 24/03/05 14:12
Messaggi: 224
Residenza: Trieste

MessaggioInviato: 24 Apr 2007 15:11    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
WeBBeR
Mortale devoto
Mortale devoto


Registrato: 23/04/07 23:25
Messaggi: 5

MessaggioInviato: 24 Apr 2007 15:11    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
Crono
Semidio
Semidio


Registrato: 24/03/05 14:12
Messaggi: 224
Residenza: Trieste

MessaggioInviato: 24 Apr 2007 16:36    Oggetto: Rispondi

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 *>(&note), 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 *>(&note), 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
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
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