Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    19

    Ancora aiuto file c++ !!!

    Ciao a tutti!
    Ho bisogno disperato di aiuto su una procedure per salvare e leggere un vettore su disco.
    Innanzittuto ho la classe:

    //Struttura contenente i dati anagrafici di ogni atleta.
    class DatiAtleta {
    public:
    int eta;
    char nome[SIZE], cognome[SIZE], residenza[SIZE];
    };

    E poi creo un vettore contenente un certo numero di queste classi:

    //L'elenco degli atleti
    vector <DatiAtleta> EA; //E lenco A tleti...

    Poi utilizzo due metodi, uno per salvare questo elenco e uno per riaprirlo:

    void Atleti::salvaAtleti() {
    FILE *prova;
    prova = fopen("Dati.dat", "w");
    fwrite(&EA, sizeof(EA), 1, prova);

    fclose(prova);
    };


    void Atleti::apriAtleti() {
    FILE *prova;
    prova = fopen("Dati.dat", "r");
    fread(&EA, sizeof(EA), 1, prova);
    fclose(prova);
    };

    Quando salvo non mi viene dato nessun errore, ma quando riapro il file, invece di trovare i dati

    corretti, trovo dei caratteri a caso...
    Grazie in anticipo a chi mi risolve questo problema!
    Ciao!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Ciao, come da Regolamento utilizza dei titoli più significativi per aprire discussioni, seguendo le convenzioni prestabilite.

    Il titolo di questa discussione lo correggo io.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    perchè in teoria scrive caratter ascii e non testo. Usa questo modificandolo in base alle tue esigenze


    codice:
    #include <fstream.h>
    #include <iostream.h>
    
     int main () {
    			fstream f;
    			char testo []={'c','i','a','o'};
    
    			f.open ("prova.txt", ios::out);
    			f.write((char*)(&testo), sizeof(char[4]));
    			return 0;
    			};

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Non conosco il C++ in modo approfondito, ma sospetto che non sia corretto utilizzare le classi in quel modo.

    Il vettore che hai dichiarato è un array di riferimenti a oggetti (istanze) della classe che devono essere create; inoltre, una volta create, non credo sia possibile scriverle direttamente sul file in quel modo, poichè generalmente una classe contiene anche elementi architetturali e spesso non è detto che, a seconda di ottimizzazioni, la classe venga ripristinata esattamente com'è. Ad esempio, il compilatore potrebbe eliminare qualche campo inutilizzato o modificare l'aspetto binario della classe stessa in base al suo utilizzo, rendendo poi impossibile recuperare i dati correttamente.

    Secondo me, dovresti usare una struct che, se non ricordo male, rispecchia un record (Pascal) al posto di class, oppure implementare il codice che, campo per campo, salva i dati della classe in un file e successivamente il recupera usando un formato personalizzato, un tuo protocollo, e non facendo lo "streaming" direttamente su disco.

    Poi, ribadisco, non ho usato molto C++ e quindi potrei aver scritto una marea di sciocchezze.

    Attendi feedback e altri suggerimenti...

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    quello è un esempio funzionante che ho trovato in una guida

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da perzem
    quello è un esempio funzionante che ho trovato in una guida
    Scusami, ho sbagliato a quotare ma mi riferivo al codice postato inizialmente da chi ha aperto la discussione.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    queste sono le funzioni principali per scrivere\leggere su file.Io credo ti servano le ultime 2

    fwrite() ed fread() per leggere scrivere array(ricorda il \n finale)
    fputs() ed fgets() per leggere scrivere/stringhe
    fputc() ed fgetc() per leggere scrivere caratteri
    fprintf() ed fscanf() per scrivere testo direttamente e formattarlo secondo il bisogno (stessa sintassi di printf e scanf).

  8. #8
    come giustamente diceva alka, una classe e` inutile per un tipo di dato di quel genere.

    si puo' ovviare con la *struct*, che, IMHO, e` piu' funzionale e facile da gestire.

    codice:
    typedef struct {
         int eta;
         char nome[SIZE], cognome[SIZE], residenza[SIZE];
    } Atleta;
    e poi per le funzioni di scrittura:
    codice:
    Atleta atleta;
    
    fstream fio("file.dat", ios::in | ios::out);
    
    fio.write(reinterpret_cast<const char*>( &atleta ), sizeof(Atleta));
    la lettura e` quasi simile:
    codice:
    fio.read(reinterpret_cast<char*>( &atleta ), sizeof(Atleta));
    Suggerirei anche un campo che potrebbe funzionare come una sorta di chiave univoca, un semplice campo intero da inserire nella struct. Tipo:
    int id;

    con questo campo ti puoi spostare all'interno del file con l'operatore *sizeof*. Per esempio:
    codice:
    fio.seekp((atleta.id - 1)  * sizeof(Atleta));
    P.S. niente da obbiettare sulle funzioni C, ma mi chiedevo come mai, se non si hanno esigenze particolari, non usare le classi di C++ per scrivere su disco, considerando anche le ottimizzazioni che possiedono...

    Saluti
    <| http://cikkox.altervista.org |>
    <| GNU/Linux Registered User #365929 |>
    <| GnuPG/OpenPGP key available |>

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    19
    Il mio problema continua...
    So di essere decisamente tardo col C, purtroppo sono abituato al java, e lì gestire i file è un gioco da ragazzi che richiede due righe di codice e prende in pasto qualsiasi cosa...

    ::in risposta a cikko:
    Il mio problema è che devo salvare un elenco di quegli oggetti, non una struct sola. In effetti ho convertito la classe in una struct, e non ho dovuto modificare altro codice, ma il problema rimane.
    Oltretutto non capisco cosa vul dire nella write il codice:
    reinterpret_cast<const char*>

    Ho provato diversi modi, mai un errore segnalato in compilazione e nemmeno al momento di provare il programma. Solo che quando lo riavvio e leggo il file, i dati sono misteriosamente sostituiti dal caratteri a caso...

    Grazie ancora a tutti!

  10. #10
    Originariamente inviato da alanPi
    ::in risposta a cikko:
    Il mio problema è che devo salvare un elenco di quegli oggetti, non una struct sola. In effetti ho convertito la classe in una struct, e non ho dovuto modificare altro codice, ma il problema rimane.
    Oltretutto non capisco cosa vul dire nella write il codice:
    reinterpret_cast<const char*>
    il reinterpret_cast<const char*> in genere e` usato nei cast in dati non standard, comunque ti devi decidere cosa usare, non e` questione di essere tardo col C. O usi questl'ultimo o usi C++, e dunque in ogni caso e` consigliabile una buona documentazione. Il C++, come ho gia' scritto, ti fa perdere meno tempo nella scrittura su disco. Poi scegli quello che meglio ti aggrada o quello che padroneggi di piu'.
    In particolare guardati come scrivere dati in formato testo o binario.

    Saluti
    <| http://cikkox.altervista.org |>
    <| GNU/Linux Registered User #365929 |>
    <| GnuPG/OpenPGP key available |>

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.