Aiuto esercizio con puntatori

di cslash89 il
8 risposte
Buonasera a tutti sto svolgendo un esercizio, ma non riesco a farlo funzionare con i puntatori.
Questa è la versione senza puntatori e tutto fila liscio:

#include <iostream>
#include <fstream>

using namespace std;

struct musica{
    int ID;
    char nomeArtista[50];
    char genere[30];
    char nazionalita[50];
};
const string NOMEARCH="musica.dat";


int main()
{
     
   musica artista;
   //artista=new musica;
   ofstream fout(NOMEARCH.c_str(), ios::out | ios::binary);
   
    
    cout<<"Inserire l'ID dell'artista: ";
    cin>>artista.ID;
   
    while(artista.ID!=0){
       
        
        cin.ignore();
        cout<<"Inserire il nome dell'artista: ";
        cin.getline(artista.nomeArtista, 50);
        cout<<"Inserire il genere dell'artista: ";
        cin.getline(artista.genere, 30);
        cout<<"Inserire la nazionalita' dell'artista: ";
        cin.getline(artista.nazionalita, 50);
        fout.write((char*) &artista, sizeof(artista));
        
        cout<<"Inserire l'ID dell'artista: ";
        cin>>artista.ID;
       
        
    }
    
    fout.close();
    
    ifstream fin(NOMEARCH.c_str(), ios::in | ios::binary);
    
    while(fin.read((char*) &artista, sizeof(artista))){
        cout<<"ID artista: "<<artista.ID<<endl;
        cout<<"Nome artista: "<<artista.nomeArtista<<endl;
        cout<<"Genere: "<<artista.genere<<endl;
        cout<<"Nazionalita' "<<artista.nazionalita<<endl;
    }
    fin.close();
    
    //delete []artista;
    return 0;
}
Questa invece è la versione con i puntatori:

#include <iostream>
#include <fstream>

using namespace std;

struct musica{
    int ID;
    char nomeArtista[50];
    char genere[30];
    char nazionalita[50];
};
const string NOMEARCH="musica.dat";


int main()
{
     
   musica* artista;
   //artista=new musica;
   ofstream fout(NOMEARCH.c_str(), ios::out | ios::binary);
   
    
    cout<<"Inserire l'ID dell'artista: ";
    cin>>artista->ID;
   
    while(artista->ID!=0){
       
        
        cin.ignore();
        cout<<"Inserire il nome dell'artista: ";
        cin.getline(artista->nomeArtista, 50);
        cout<<"Inserire il genere dell'artista: ";
        cin.getline(artista->genere, 30);
        cout<<"Inserire la nazionalita' dell'artista: ";
        cin.getline(artista->nazionalita, 50);
        fout.write((char*) &artista, sizeof(artista));
        
        cout<<"Inserire l'ID dell'artista: ";
        cin>>artista->ID;
       
        
    }
    
    fout.close();
    
    ifstream fin(NOMEARCH.c_str(), ios::in | ios::binary);
    
    while(fin.read((char*) &artista, sizeof(artista))){
        cout<<"ID artista: "<<artista->ID<<endl;
        cout<<"Nome artista: "<<artista->nomeArtista<<endl;
        cout<<"Genere: "<<artista->genere<<endl;
        cout<<"Nazionalita' "<<artista->nazionalita<<endl;
    }
    fin.close();
    
    //delete []artista;
    return 0;
}

Dove sbaglio?

8 Risposte

  • Se usi i puntatori, questa istruzione
    musica* artista;
    dichiara solo un puntatore alla struttura 'artista', ma non alloca lo spazio per la struttura medesima. Decommenta quel
    artista=new musica;
    (poi il programma non funziona per altri motivi, ma facciamo una cosa alla volta).
  • Ho risolto, il problema era qui:
    
    fout.write((char*) &*artista, sizeof(*artista));
    
    
    while(fin.read((char*) &*artista, sizeof(*artista)))
    
  • Come fai ad aver risolto in quel modo?
    Rifletti bene su cià che ti ha detto Andrea Quaglia
  • Weierstrass ha scritto:


    Come fai ad aver risolto in quel modo?
    Rifletti bene su cià che ti ha detto Andrea Quaglia
    Certo, avevo commentato la parte dell'allocazione dinamica, per rifare l'esercizio senza puntatori ma mi ero dimenticato di decommentarla.
    La soluzione completa è questa:
    
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    struct musica{
        int ID;
        char nomeArtista[50];
        char genere[30];
        char nazionalita[50];
    };
    const string NOMEARCH="musica.dat";
    
    
    int main()
    {
         
       musica* artista;
       artista=new musica;
       ofstream fout(NOMEARCH.c_str(), ios::out | ios::binary);
       
        
        cout<<"Inserire l'ID dell'artista: ";
        cin>>artista->ID;
       
        while(artista->ID!=0){
           
            
            cin.ignore();
            cout<<"Inserire il nome dell'artista: ";
            cin.getline(artista->nomeArtista, 50);
            cout<<"Inserire il genere dell'artista: ";
            cin.getline(artista->genere, 30);
            cout<<"Inserire la nazionalita' dell'artista: ";
            cin.getline(artista->nazionalita, 50);
            fout.write((char*) &*artista, sizeof(*artista));
            
            cout<<"Inserire l'ID dell'artista: ";
            cin>>artista->ID;
           
            
        }
        
        fout.close();
        
        ifstream fin(NOMEARCH.c_str(), ios::in | ios::binary);
        
        while(fin.read((char*) &*artista, sizeof(*artista))){
            cout<<"ID artista: "<<artista->ID<<endl;
            cout<<"Nome artista: "<<artista->nomeArtista<<endl;
            cout<<"Genere: "<<artista->genere<<endl;
            cout<<"Nazionalita' "<<artista->nazionalita<<endl;
        }
        fin.close();
        
        delete []artista;
        return 0;
    }
    
    Così funziona senza problemi.
    Pensi ci sia ancora qualcosa che non va di cui non mi accorgo?
  • Ma hai capito cosa fai con &* ?
    
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    struct musica{
        int ID;
        string nomeArtista;
        string genere;
        string nazionalita;
    };
    
    int main(){ 
       musica * artista = new musica {1, "Pippo Franco", "trash", "italiana"};
       
       ofstream fout("musica.dat", ofstream::binary);
       fout.write((char*) &*&*&*&*&*&*&*&*&*&* artista, sizeof(*artista));
       fout.close();
    
       ifstream fin("musica.dat", ifstream::binary);
       fin.read((char*) &*&*&*&*&*&*&*&*&*&* artista, sizeof(*artista));
       cout<<"ID artista: "<<artista->ID<<endl;
       cout<<"Nome artista: "<<artista->nomeArtista<<endl;
       cout<<"Genere: "<<artista->genere<<endl;
       cout<<"Nazionalita': "<<artista->nazionalita<<endl;
       fin.close();
        
       return 0;
    }
    
  • Personalmente preferisco scrivere
    fout.write((char*) artista, sizeof(musica));
  • Weierstrass ha scritto:


    Ma hai capito cosa fai con &* ?
    Accedo al contenuto della variabile di tipo puntatore "artista" .
    Però ammatto che l'esempio che mi hai fatto non l'ho compreso.
  • Andrea Quaglia ha scritto:


    Personalmente preferisco scrivere
    fout.write((char*) artista, sizeof(musica));
    Non sapevo si potesse fare anche così, seguo gli esempi del libro che uso per studiare. Comunque ora so che si può fare anche così, quindi ti ringrazio per questo prezioso suggerimento
Devi accedere o registrarti per scrivere nel forum
8 risposte