Aiuto esercizio con puntatori

di il
8 risposte

Aiuto esercizio con puntatori

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

  • Re: Aiuto esercizio con puntatori

    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).
  • Re: Aiuto esercizio con puntatori

    Ho risolto, il problema era qui:
    
    fout.write((char*) &*artista, sizeof(*artista));
    
    
    while(fin.read((char*) &*artista, sizeof(*artista)))
    
  • Re: Aiuto esercizio con puntatori

    Come fai ad aver risolto in quel modo?
    Rifletti bene su cià che ti ha detto Andrea Quaglia
  • Re: Aiuto esercizio con puntatori

    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?
  • Re: Aiuto esercizio con puntatori

    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;
    }
    
  • Re: Aiuto esercizio con puntatori

    Personalmente preferisco scrivere
    fout.write((char*) artista, sizeof(musica));
  • Re: Aiuto esercizio con puntatori

    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.
  • Re: Aiuto esercizio con puntatori

    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