Problema con programma che legge file

di il
44 risposte

44 Risposte - Pagina 2

  • Re: Problema con programma che legge file

    Inizialmente avevo pensato di memorizzare il nome della materia in una stringa e il voto in una variabile di tipo intero, mi ero già bloccata sulla data, ho provato a creare la classe e non ci sono riuscita, come ho detto ci sto provando da ieri, e poi sono andata in crisi perché per quanto ne so una variabile può memorizzare un risultato e non un numero imprecisato di risultati. So che a te sembrano cose stupide e che probabilmente ti sto facendo esasperare, ma mi succede sempre così quando non conosco ancora bene un argomento, vado in crisi e non so come fare. E ho chiesto qui perché non sapevo nemmeno da che parte cominciare, come puoi notare...
  • Re: Problema con programma che legge file

    Una data può stare benissimo in una stringa.

    Se devi scrivere in C o in C++ le cose cambiano.

    Probabilmente non ti serve neanche la classe, per iniziare, prova a dichiarare le tre variabili nel main.
  • Re: Problema con programma che legge file

    Okay, allora inizialmente le avevo dichiarate così:
    int main(){
    	string materia;
    	string data;     //questa non c'era, ma la aggiungo per renderlo "completo"
    	int voto;
    }
    però siccome c'era sempre il problema che potevo memorizzare un solo valore in ogni variabile sono iniziate le crisi
  • Re: Problema con programma che legge file

    Adesso, dato che nel primo post avevi detto di avere fatto un esercizio simile con l'input da tastiera, ce lo puoi mostrare?
  • Re: Problema con programma che legge file

    Non l'avevo fatto esattamente così: l'avevo creato col presupposto di sapere quante materie, voti e date sarebbero stati inseriti, non è uguale e infatti quando l'ho fatto vedere al professore mi ha detto che sarebbe anche andato bene, dal momento che funzionava e faceva quello che era richiesto, ma mi ha anche detto di lavorare proprio su questa cosa e per questo ho cercato di crearlo daccapo e mi sono bloccata... comunque l'ho eliminato, ora provo a rifarlo e appena è pronto lo metto qui
  • Re: Problema con programma che legge file

    Volendo essere costruttivo, direi che puoi seguire una logica di questo tipo (tra le tante possibili)...

    1 ) predispongo una classe (o anche una struct) che contenga tre elementi: un array di caratteri dove mettere la stringa col nome dell'esame, un intero dove mettere il punteggio ottenuto e un gruppo di altri tre interi dove mettere giorno, mese e anno della data
    2 ) conto le righe presenti nel file, semplicemente contando quanti sono gli "a capo" (+1)
    3 ) alloco un array di classi (o di struct) in quantità pari alle righe rilevate nel file
    4 ) apro il file (fopen())
    5 ) avvio un ciclo che si ripeta per tante volte quante sono le righe
    6 ) nel ciclo...
    a. "carico" le righe una ad una in un buffer di dimensioni adeguate (un ciclo con ripetute chiamate a fgets())
    b. analizzo una ad una le stringhe "caricate" per "compilare" gli elementi dell'array di classi o di struct allocato in 3)
    c. se una delle righe risulta mal formattata, esco prematuramente dal ciclo
    7 ) controllo che il contatore del ciclo sia uguale al numero delle righe (in caso contrario significa che qualche riga è formattata male, o contiene dati non validi)
    8 ) chiudo il file aperto in 4)
    9 ) se i dati sono stati tutti caricati correttamente, li elaboro come richiede l'esercizio
    10 ) dealloco l'array allocato in 3)

    Alcuni di questi passaggi "stanno meglio" se isolati in funzioni esterne al main(), anche perché il codice risulta più facile da gestire se diviso in unità il più possibile indipendenti. Per intendersi, il mio main() si limita a poche righe (ovviamente il "grosso" avviene in carica_dati_esami() ):
    int main() {
        int qe;
    
        Esame *e = carica_dati_esami( kStrNomeFile, &qe );
    
        if( NULL != e ) {
            // fai quel che devi fare con i dati "caricati" in e
            delete[] e; e = NULL;
        }
    
        return 0;
    }
    Lo sviluppo dell'esercizio può essere anche piuttosto lungo (specie se insisti nel verificare ogni possibile errore, come sarebbe sempre meglio fare), però, se ben organizzato, non è particolarmente complicato.

    Se non sai ancora gestire l'allocazione dinamica potresti trovare più semplice predisporre un array di dimensioni fisse sufficiente per contenere il numero massimo di strutture/classi del quale prevedi di poter avere bisogno.

    Vedi se ti può essere utile quel che ti ho scritto.
  • Re: Problema con programma che legge file

    AldoBaldo ha scritto:


    Volendo essere costruttivo, direi che puoi seguire una logica di questo tipo (tra le tante possibili)...

    1 ) predispongo una classe (o anche una struct) che contenga tre elementi: un array di caratteri dove mettere la stringa col nome dell'esame, un intero dove mettere il punteggio ottenuto e un gruppo di altri tre interi dove mettere giorno, mese e anno della data
    2 ) conto le righe presenti nel file, semplicemente contando quanti sono gli "a capo" (+1)
    3 ) alloco un array di classi (o di struct) in quantità pari alle righe rilevate nel file
    4 ) apro il file (fopen())
    5 ) avvio un ciclo che si ripeta per tante volte quante sono le righe
    6 ) nel ciclo...
    a. "carico" le righe una ad una in un buffer di dimensioni adeguate (un ciclo con ripetute chiamate a fgets())
    b. analizzo una ad una le stringhe "caricate" per "compilare" gli elementi dell'array di classi o di struct allocato in 3)
    c. se una delle righe risulta mal formattata, esco prematuramente dal ciclo
    7 ) controllo che il contatore del ciclo sia uguale al numero delle righe (in caso contrario significa che qualche riga è formattata male, o contiene dati non validi)
    8 ) chiudo il file aperto in 4)
    9 ) se i dati sono stati tutti caricati correttamente, li elaboro come richiede l'esercizio
    10 ) dealloco l'array allocato in 3)

    Alcuni di questi passaggi "stanno meglio" se isolati in funzioni esterne al main(), anche perché il codice risulta più facile da gestire se diviso in unità il più possibile indipendenti. Per intendersi, il mio main() si limita a poche righe (ovviamente il "grosso" avviene in carica_dati_esami() ):
    int main() {
        int qe;
    
        Esame *e = carica_dati_esami( kStrNomeFile, &qe );
    
        if( NULL != e ) {
            // fai quel che devi fare con i dati "caricati" in e
            delete[] e; e = NULL;
        }
    
        return 0;
    }
    Lo sviluppo dell'esercizio può essere anche piuttosto lungo (specie se insisti nel verificare ogni possibile errore, come sarebbe sempre meglio fare), però, se ben organizzato, non è particolarmente complicato.

    Se non sai ancora gestire l'allocazione dinamica potresti trovare più semplice predisporre un array di dimensioni fisse sufficiente per contenere il numero massimo di strutture/classi del quale prevedi di poter avere bisogno.

    Vedi se ti può essere utile quel che ti ho scritto.
    Sì, praticamente con la domanda che ho fatto all'inizio cercavo una risposta del genere, grazie molti di questi passaggi non sapevo nemmeno che si potessero fare/come farli e tante altre cose...
    Siccome adesso è tardi, domani mi metto e vi posto sia il mio (disastroso) programma dell'altra volta che un altro fatto seguendo questi passaggi... se riesco a farlo insomma hahahaah ma almeno adesso so quali sono i singoli passaggi da seguire, argomenti da conoscere ecc e dovrebbe andare meglio, grazie!
  • Re: Problema con programma che legge file

    Ma é tutto un controsenso...
    Stai imparando ora a trattare i file e dovresti allocare dinamicamente classi o strutture? Sai cosa significhi e come si alloca dinamicamente in c++?? E poi il testo non impone che tutto il file sia caricato in memoria ma che sia semplicemente elaborato mentre si legge.

    È tutto molto più semplice e somiglia molto all'altro esercizio. Non complicare le cose e non farle come le farebbe chi conosce già altri argomenti.

    In pratica, dovresti semplicemente

    1 ) dichiarare e inizializzare opportune variabili per i dati da leggere dal file e da elaborare
    2 ) aprire il file (non con la fopen, stiamo usando il C++ ! Vedi fstream ...)
    3 ) ciclo di lettura dei dati riga per riga
    a) elaborazione dei dati della singola linea letta
    b) incremento contatore righe lette
    4 ) chiusura del file dopo fine ciclo
    5 ) calcolo media
    6 ) presentazione risultati

    e quello che ti chiedevo di iniziare a fare, sin dalle prime risposte, era il punto 1).
  • Re: Problema con programma che legge file

    oregon ha scritto:


    Ma é tutto un controsenso...
    Stai imparando ora a trattare i file e dovresti allocare dinamicamente classi o strutture? Sai cosa significhi e come si alloca dinamicamente in c++?? E poi il testo non impone che tutto il file sia caricato in memoria ma che sia semplicemente elaborato mentre si legge.

    È tutto molto più semplice e somiglia molto all'altro esercizio. Non complicare le cose e non farle come le farebbe chi conosce già altri argomenti.

    In pratica, dovresti semplicemente

    1 ) dichiarare e inizializzare opportune variabili per i dati da leggere dal file e da elaborare
    2 ) aprire il file (non con la fopen, stiamo usando il C++ ! Vedi fstream ...)
    3 ) ciclo di lettura dei dati riga per riga
    a) elaborazione dei dati della singola linea letta
    b) incremento contatore righe lette
    4 ) chiusura del file dopo fine ciclo
    5 ) calcolo media
    6 ) presentazione risultati

    e quello che ti chiedevo di iniziare a fare, sin dalle prime risposte, era il punto 1).
    Teoricamente so cos'è l'allocazione dinamica, la classe ecc, ma siccome il vecchio prof non ce lo faceva fare non mi sono mai allenata, le ho guardate solo per curiosità, ma non ho mai provato a metterle in un programma.
    Comunque sono d'accordo sul non complicarsi la vita, ma volevo qualcosa di diverso anche se più difficile perché me la complico senza volerlo: cerco di fare i programmi sempre facendo cose che ho già fatto, senza mai provare ad allenarmi su niente di nuovo e di solito esce qualcosa di illeggibile e che probabilmente non fa nemmeno quello che deve (inizialmente addirittura cercavo di sostituire for e while con if/else perché era l'unico che avevo capito bene...). Per esempio il programma di cui ho messo la traccia era qualcosa del genere:
    int main(){
    string materia1,materia2,materia3;
    int voto1,voto2,voto3,media;
    string data1,data2,data3;   //questo in realtà erano tutti interi, giorno, mese, anno ecc per tre volte quindi un casino
    
    poi una serie di cin e cout per inserire materie, date e voti, poi se non sbaglio era così:
    media = (voto1+voto2+voto3)/3;
    e di nuovo una serie di cout per visualizzare voti, date, materie e la media
    Ah, e una serie di if/else per scegliere il voto massimo e stamparlo a video.
    Alla fine faceva inserire le materie, i voti e le date, faceva la media, stampava i risultati insieme a materia e data, ma era illeggibile, lungo e complicato e in più l'utente non poteva per esempio inserire due voti della stessa materia, oppure 2 o 4 voti invece di 3, insomma non era come richiesto. Ho provato anche con i cicli iterativi ma ovviamente stampava solo gli ultimi dati inseriti (ultima data, ultimo voto, ultima materia), quindi mi sono proprio arresa.
    Praticamente mi dici di non complicarmi la vita facendo cose difficili, ma probabilmente sarebbe tutto più facile non ti ho mandato tutto il codice perché era una roba lunghissima da riscrivere ma spero di aver reso il concetto...
  • Re: Problema con programma che legge file

    Praticamente mi dici di non complicarmi la vita facendo cose difficili
    Soprattutto perché, se io fossi il professore, mi aspetterei un certo tipo di soluzione, non roba che non ti ho mai spiegato.
    Usare classi allocate dinamicamente, in questo caso, è come sparare ad una mosca con un cannone. E non era neanche richiesto.
    E' vero che, come hai detto, non devi consegnare, ma devi pure scrivere codice adeguato.
    non ti ho mandato tutto il codice perché era una roba lunghissima da riscrivere
    Da riscrivere? Dovresti fare un semplice copia incolla, mica vorrai riscriverlo. Sarebbe stato utile per capire come avevi impostato il programma.
    Anche se non funzionante o parzialmente funzionante.

    In ogni caso, comincia a scrivere e mostrare il codice di questo esercizio partendo dal punto 1) e poi si va avanti.
  • Re: Problema con programma che legge file

    oregon ha scritto:


    Praticamente mi dici di non complicarmi la vita facendo cose difficili
    Soprattutto perché, se io fossi il professore, mi aspetterei un certo tipo di soluzione, non roba che non ti ho mai spiegato.
    Usare classi allocate dinamicamente, in questo caso, è come sparare ad una mosca con un cannone. E non era neanche richiesto.
    E' vero che, come hai detto, non devi consegnare, ma devi pure scrivere codice adeguato.
    non ti ho mandato tutto il codice perché era una roba lunghissima da riscrivere
    Da riscrivere? Dovresti fare un semplice copia incolla, mica vorrai riscriverlo. Sarebbe stato utile per capire come avevi impostato il programma.
    Anche se non funzionante o parzialmente funzionante.

    In ogni caso, comincia a scrivere e mostrare il codice di questo esercizio partendo dal punto 1) e poi si va avanti.
    Eh sì, sarebbe da riscrivere perché l'ho eliminato, perciò ti ho mandato giusto le parti più brevi.
    Quindi se la soluzione dev'essere facile e non devo imparare cose nuove mi restano solo due problemi da risolvere: come far leggere il file al programma e poi come salvare un numero imprecisato di dati... insomma una volta capito questo dovrebbe essere semplice, no? hahaha
  • Re: Problema con programma che legge file

    Se scrivi in C userai la fopen per aprire il file, in C++ userai la classe ifstream, leggi il documento

    http://www.cplusplus.com/reference/fstream/ifstream/open/

    Poi leggerai con l'operatore >>

    https://stackoverflow.com/questions/7868936/read-file-line-by-line
  • Re: Problema con programma che legge file

    Oregon, avevo già immaginato anch'io che l'allocazione dinamica potesse rivelarsi un problema. Per questo avevo scritto (cito me stesso): "Se non sai ancora gestire l'allocazione dinamica potresti trovare più semplice predisporre un array di dimensioni fisse sufficiente per contenere il numero massimo di strutture/classi del quale prevedi di poter avere bisogno."

    Volendo evitare di allocare l'array non serve neppure pre-conteggiare la quantità delle righe presenti nei dati.

    Caricare in memoria tutti i dati può essere un passo inutile nell'esercizio specifico, ma ritengo sia senz'altro utile in una quantità di casi pratici, per cui imparare a farlo non credo sia tempo sprecato -- una volta che i dati sono in memoria in modo strutturato è senz'altro più facile procedere a qualsiasi elaborazione possa venire in mente.

    Senza il precaricamento diventa superfluo anche l'uso delle classi e, al limite, perfino quello delle strutture. Del resto, e cito di nuovo me stesso, la soluzione che ho indicato è una "tra le tante possibili".

    Secondo me, a parte il percorso che uno intende seguire, l'aspetto più importante rimane quello di spezzare il problemone in tanti problemini da affrontare uno ad uno, possibilmente in funzioni/procedure il più possibile indipendenti. Magari (e dico magari) provando a usare anche una o più semplici classi "personalizzate"...

    Una domanda: è un errore "mischiare" C e C++? Perché io lo faccio spesso, dal momento che ho solo delle "infarinature" del C++ che uso più che altro quando le trovo comode, senza pormi troppi interrogativi sulla liceità del procedimento.
  • Re: Problema con programma che legge file

    oregon ha scritto:


    Se scrivi in C userai la fopen per aprire il file, in C++ userai la classe ifstream, leggi il documento

    http://www.cplusplus.com/reference/fstream/ifstream/open/

    Poi leggerai con l'operatore >>

    https://stackoverflow.com/questions/7868936/read-file-line-by-line
    Grazie, do subito un'occhiata!
    Comunque sì, uso il C++, stavo leggendo qualcosa riguardo ifstream in questo momento, effettivamente adesso sembra abbastanza semplice questo programma
  • Re: Problema con programma che legge file

    AldoBaldo ha scritto:


    Caricare in memoria tutti i dati può essere un passo inutile nell'esercizio specifico, ma ritengo sia senz'altro utile in una quantità di casi pratici, per cui imparare a farlo non credo sia tempo sprecato -- una volta che i dati sono in memoria in modo strutturato è senz'altro più facile procedere a qualsiasi elaborazione possa venire in mente.
    A me disturba l'idea che un dato dopo essere stato letto non sarà salvato da nessuna parte e quindi sento il bisogno di capire come si fa a salvarne un numero imprecisato, cioè vado nel panico "e se dopo mi serve come faccio??!!!" ecco.
    Non so se è una cosa avanzata ma sento il bisogno di impararla vi prego capitemi hahhah
Devi accedere o registrarti per scrivere nel forum
44 risposte