[C++]Esercizio sui file
Salve a tutti, avrei questo programma da implementare sulla gestione di una ferramenta: in pratica il programma deve aprire un file "hardware.dat", mi deve permettere di inserire gli attrezzi, di visualizzarli tutti, di eliminarne quelli con quantità = 0, e di aggiornare qualsiasi campo del record Attrezzo.
Le funzioni eliminaAttrezzo e aggiornaAttrezzo le ho implementate e con numerose prove fatte ho verificato che funzionano bene... il problema sta nell'inserimento e nella stampa... vi posto il codice che ho scritto (evitanto di inserire le funzioni di elimina e aggiorna):
header.h
header.cpp
main.cpp
Allora gli errori che mi dà in output sono strani infatti:
1) inserisco il primo attrezzo, poi stampo e va tutto bene; inserisco il secondo attrezzo, poi stampo e va ancora bene; se invece inserisco il primo e poi subito il secondo senza stampare in mezzo, non mi stampa niente più
2) dopo avere inserito due attrezzi (con la stampa in mezzo), se ne inserisco un'altro succede il finimondo al momento della stampa
vi posto un output come esempio:
Forse il problema sta nell'aver dichiarato oggetti per gestire il file con fstream("hardware.dat") senza specificare con ios::in o ios::out o qualcos'altro...
Qualcuno potrebbe aiutarmi? Grazie mille a tutti coloro che mi risponderanno
Le funzioni eliminaAttrezzo e aggiornaAttrezzo le ho implementate e con numerose prove fatte ho verificato che funzionano bene... il problema sta nell'inserimento e nella stampa... vi posto il codice che ho scritto (evitanto di inserire le funzioni di elimina e aggiorna):
header.h
header.cpp
main.cpp
Allora gli errori che mi dà in output sono strani infatti:
1) inserisco il primo attrezzo, poi stampo e va tutto bene; inserisco il secondo attrezzo, poi stampo e va ancora bene; se invece inserisco il primo e poi subito il secondo senza stampare in mezzo, non mi stampa niente più
2) dopo avere inserito due attrezzi (con la stampa in mezzo), se ne inserisco un'altro succede il finimondo al momento della stampa
vi posto un output come esempio:
Forse il problema sta nell'aver dichiarato oggetti per gestire il file con fstream("hardware.dat") senza specificare con ios::in o ios::out o qualcos'altro...
Qualcuno potrebbe aiutarmi? Grazie mille a tutti coloro che mi risponderanno

Risposte
Beh, effettui una seek() per l'inserimento sulla base del codice, ma devi considerare che (forse) questa non va a buon fine.
Intendi una seekp() in fase di scrittura? Quella serve per scrivere sul file in modo ordinato e devo ammettere che l'ho copiata uguale da un altro esercizio da cui ho preso spunto per comprendere bene l'uso dei file ad accesso sequenziale e casuale.
In realtà ho provato pure in un modo alternativo (ancora più simile all'esercizio da cui ho preso spunto) ma è sempre la stessa cosa:
Potresti darmi una mano?
Grazie mille
In realtà ho provato pure in un modo alternativo (ancora più simile all'esercizio da cui ho preso spunto) ma è sempre la stessa cosa:
Potresti darmi una mano?

Ho fatto copiancolla del tuo codice e ricompilato, ma non riesco a riprodurre l'errore... Traduzione: a me funziona.
Magari stai lavorando sotto \$finestre\$? Potrebbe essere un problema (sic) del sistema operativo.
Magari stai lavorando sotto \$finestre\$? Potrebbe essere un problema (sic) del sistema operativo.
Non ho testato il codice, ma prova a scrivere
e in modo simile per il file in scrittura. fstream lavora infatti di default in modalità testuale (ma non in linux in cui utilizza la modalità binaria sempre) e quindi potrebbe fare alcune conversioni durante la lettura. Quando si lavora con file binari conviene SEMPRE inserire l'opzione in modo esplicito in quanto in caso contrario il comportamento dipenderà dalle convenzioni del sistema operativo.
fstream leggiDaFile("hardware.dat", fstream::in | fstream::binary);
e in modo simile per il file in scrittura. fstream lavora infatti di default in modalità testuale (ma non in linux in cui utilizza la modalità binaria sempre) e quindi potrebbe fare alcune conversioni durante la lettura. Quando si lavora con file binari conviene SEMPRE inserire l'opzione in modo esplicito in quanto in caso contrario il comportamento dipenderà dalle convenzioni del sistema operativo.
@apatriarca
Hai probabilmente identificato il problema. In effetti davo per scontato utilizzasse la modalità binaria.
Hai probabilmente identificato il problema. In effetti davo per scontato utilizzasse la modalità binaria.
Grazie mille ad entrambi, ho capito cosa intendete però avrei ancora un problema e un dubbio:
il dubbio è: fstream::in oppure fstream::binary equivalgono a ios::in o ios::binary?
Per quanto riguarda il problema, nella funzione stampaMagazzino() al posto di
ho messo
ora però nella funzione inserisciAttrezzo() cosa metto affianco al nome del file? Ho provato con
ma ogni volta che inserisco un nuovo attrezzo mi cancella quello precedente... ho provato anche a sostituire out con ate o con app ma non funzionano proprio...
Mi dareste una mano? Grazie ancora.
il dubbio è: fstream::in oppure fstream::binary equivalgono a ios::in o ios::binary?
Per quanto riguarda il problema, nella funzione stampaMagazzino() al posto di
fstream leggiDaFile("hardware.dat");
ho messo
fstream leggiDaFile("hardware.dat", fstream::in | fstream::binary);
ora però nella funzione inserisciAttrezzo() cosa metto affianco al nome del file? Ho provato con
fstream scriviSuFile("hardware.dat", fstream::out | fstream::binary);
ma ogni volta che inserisco un nuovo attrezzo mi cancella quello precedente... ho provato anche a sostituire out con ate o con app ma non funzionano proprio...
Mi dareste una mano? Grazie ancora.

Io direi di mettere:
Riprova e facci sapere.
fstream scriviSuFile("hardware.dat", fstream::in | fstream::out | fstream::binary);
Riprova e facci sapere.
Grazieeee!!! Sei un grande! Ho sostituito la tua linea di codice anche nelle funzioni di elimina e aggiorna attrezzi e ora funziona tutto alla perfezione! Grazie ancora ciaoo

