[C++]errore nel merge() e informazioni sul quicksort

di il
7 risposte

[C++]errore nel merge() e informazioni sul quicksort

Buongiorno a tutti,
come da titolo sto cercando di creare una funzione merge() che mi unisca due file in un terzo e in seguito mi faccia un quicksort di un elemento presente nei due file.
Questa è la funzione merge() da me creata:

fstream u;
fstream d;
fstream f;

void merge(){
scarpa_uomo su;
scarpa_donna sd;

u.open("uomo.dat",ios::in|ios::binary);
d.open("donna.dat",ios::in|ios::binary);
f.open("scarpa.dat",ios::out|ios::binary);

while(u){

u.read((char*)&su,sizeof(scarpa_uomo));
f.write((char*)&su,sizeof(scarpa_uomo));
}

while(d){

d.read((char*)&sd,sizeof(scarpa_donna));
f.write((char*)&sd,sizeof(scarpa_donna));

}

u.close();
d.close();
f.close();
}
Questo e' il merge() da me creato.
Devo premettere che tale funzione mi stampa i valori dei due file ma il compilatore mi da un errore:Eccezione non gestita a 0x1048ad54 (msvcp100d.dll) in appello 25 settembre c++.exe: 0xC0000005: Violazione di accesso nella scrittura del percorso 0xfeeefeee.
Perchè tale errore?Leggendo su internet ho inteso che tale errore è dovuto al fatto che non si può scrivere std::string in maniera binaria.
Se volessi ordinare gli elementi dei due file in un unico file con quicksort come devo muovermi?
Se c'è bisogno di vedere tutto il codice ditemelo che lo posto.
Spero in un vostro aiuto.
Grazie e buon pranzo.

7 Risposte

  • Re: [C++]errore nel merge() e informazioni sul quicksort

    Leggendo su internet ho inteso che tale errore è dovuto al fatto che non si può scrivere std::string in maniera binaria.
    Infatti non è possibile. Se devi scrivere in un file in modo binario sei obbligato a usare array di char a dimensione fissa (i char qualcosa[256] per capirsi).
    Se volessi ordinare gli elementi dei due file in un unico file con quicksort come devo muovermi?
    Carica il contenuto dei due file in un unico array, applica il quicksort su di esso (facendo attenzione alla funzione da passare come parametro) e poi riscrivi i vari elementi in un file.
    Il come fare questo è delegato all'implementatore.
    Comunque mostra la definizione delle strutture:
    scarpe_uomo
    scarpe_donna
  • Re: [C++]errore nel merge() e informazioni sul quicksort

    L'oggetto std::string() e' un affare complicato, generato a partire da un template, e non una semplice stringa.

    Viene correttamente gestito dagli std:iostream che trattano oggetti, non da un std::fstream che tratta solo byte.

    Comunque c'e' una soluzione banale:

    std::string::c_str()

    ti ritorna la stringa in forma di classica string C (con il "\0" come terminatore)
  • Re: [C++]errore nel merge() e informazioni sul quicksort

    Scarpa_uomo e scarpa_donna sono classi derivate.
    Questo è il file d'intestazione del mio programma:
    #include<iostream>
    #include<string>

    using namespace std;

    #ifndef CLASSI_H
    #define CLASSI_H

    class scarpa{
    private:
    int id_scarpa;
    string produttore;
    int taglia;
    int prezzo;
    public:
    void set_scarpa(int,string,int,int);
    int get_id();
    string get_prod();
    int get_tg();
    int get_p();
    scarpa(){};
    ~scarpa(){};
    };
    class scarpa_uomo:public scarpa{
    private:
    int presenza_lacci;
    public:
    void set_scarpa_uomo(int,string,int,int,int);
    int get_lacci();
    scarpa_uomo(){};
    ~scarpa_uomo(){};
    };
    class scarpa_donna:public scarpa{
    private:
    int altezza_tacco;
    public:
    void set_scarpa_donna(int,string,int,int,int);
    int get_h();
    scarpa_donna(){};
    ~scarpa_donna(){};
    };
    #endif
  • Re: [C++]errore nel merge() e informazioni sul quicksort

    Se vuoi scrivere in binario, come hai fatto nel codice precedente, quel string produttore devi cambiarlo in char produttore[MAX_LEN] dove MAX_LEN è il numero di caratteri che ritieni necessario.
    Il problema di fondo è che mentre in scrittura std::string mal che vada scrive spazzatura, in lettura le strutture interne non sono inizializzate per cui hai violazioni di accesso.
    Lo stesso problema si ha con i vari container STL (vector, list, deque etc).

    L'alternativa (sempre restando sul formato binario) sarebbe serializzare e deserializzare il tutto, ma è come andare da Milano a Roma passando per Amsterdam.
  • Re: [C++]errore nel merge() e informazioni sul quicksort

    Grazie per le esaudienti spiegazioni.
    Un ultima cosa ma il merging di due file è possibile farlo senza l'utilizzo di array?
    Grazie a tutti.
  • Re: [C++]errore nel merge() e informazioni sul quicksort

    Dipende da cosa intendi con merging. Se intendi la semplice unione dei due file (come hai fatto nel codice iniziale), beh hai già la risposta: si.
    Se intendi una qualche forma di ordinamento senza passare da un array, francamente non lo so.
    Ammesso però che sia fattibile i tempi di esecuzione di un teorico ordinamento diverrebbero non dico biblici, ma certamente molto onerosi (devi star li a calcolare offset, leggere più volte lo stesso pezzo di file per fare confronti etc): insomma ti complichi la vita per niente.
    Usare un semplice array di appoggio è più semplice e veloce.
  • Re: [C++]errore nel merge() e informazioni sul quicksort

    Grazie
Devi accedere o registrarti per scrivere nel forum
7 risposte