[C++]Esercizio sui file

TheBestNapoli
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 :D

Risposte
Rggb1
Beh, effettui una seek() per l'inserimento sulla base del codice, ma devi considerare che (forse) questa non va a buon fine.

TheBestNapoli
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? :lol: Grazie mille

Rggb1
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.

apatriarca
Non ho testato il codice, ma prova a scrivere
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.

Rggb1
@apatriarca
Hai probabilmente identificato il problema. In effetti davo per scontato utilizzasse la modalità binaria.

TheBestNapoli
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
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. :D

Rggb1
Io direi di mettere:
fstream scriviSuFile("hardware.dat", fstream::in | fstream::out | fstream::binary);

Riprova e facci sapere.

TheBestNapoli
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 :-D :-D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.