Allora, ho girato un po' in internet per acquisire nuove informazioni e sono arrivato a scrivere questo programma (di cui vi posto il codice)
header.h
Codice:
#ifndef HEADER_H_
#define HEADER_H_
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
using namespace std;
struct Record{
int codice;
char nome[50];
int quantita;
float costo;
char note[100];
};
void inserisciAttrezzo(fstream &);
void stampaMagazzino(fstream &);
void eliminaAttrezzo(fstream &);
void aggiornaAttrezzo(fstream &);
void stampaAttrezzo(ostream &, const Record &);
#endif /* HEADER_H_ */
header.cpp
Codice:
#include "header.h"
void inserisciAttrezzo(fstream &scriviSuFile)
{
int cod;
cout<<"Inserire codice attrezzo: ";
cin>>cod;
Record attrezzo;
cout<<"Inserisci nome attrezzo: ";
cin.sync();
cin.getline(attrezzo.nome, 50);
cout<<"Inserisci quantita' disponibile: ";
cin>>attrezzo.quantita;
cout<<"Inserisci costo attrezzo: ";
cin>>attrezzo.costo;
cout<<"Inserisci note: ";
cin.sync();
cin.getline(attrezzo.note, 100);
attrezzo.codice = cod;
scriviSuFile.seekp((cod-1)*sizeof(Record));
scriviSuFile.write(reinterpret_cast<const char*>(&attrezzo), sizeof(Record));
}
void stampaMagazzino(fstream &leggiDaFile)
{
leggiDaFile.seekg(0);
Record attrezzo;
leggiDaFile.read(reinterpret_cast<char*>(&attrezzo), sizeof(Record));
while(!leggiDaFile.eof())
{
if(attrezzo.codice != 0)
{
stampaAttrezzo(cout, attrezzo);
}
leggiDaFile.read(reinterpret_cast<char*>(&attrezzo), sizeof(Record));
}
}
void eliminaAttrezzo(fstream &cancellaDaFile)
{
int cod;
cout<<"Inserisci il codice dell' attrezzo che vuoi eliminare: ";
cin>>cod;
cancellaDaFile.seekg((cod-1)*sizeof(Record));
Record attrezzo;
cancellaDaFile.read(reinterpret_cast<char*>(&attrezzo), sizeof(Record));
if(attrezzo.codice != 0)
{
Record vuoto = {0,"",0,0.0,""};
cancellaDaFile.seekp((cod-1)*sizeof(Record));
cancellaDaFile.write(reinterpret_cast<const char*>(&vuoto), sizeof(Record));
cout<<"L'attrezzo con codice "<<cod<<" e' stato eliminato.\n";
}
else
{
cerr<<"L'attrezzo con codice "<<cod<<" non e' prensente nel file\n";
}
}
void aggiornaAttrezzo(fstream &aggiornaFile)
{
int cod;
cout<<"Inserisci codice dell'attrezzo da aggiornare: ";
cin>>cod;
aggiornaFile.seekg((cod-1)*sizeof(Record));
Record attrezzo;
aggiornaFile.read(reinterpret_cast<char*>(&attrezzo), sizeof(Record));
if(attrezzo.codice != 0)
{
stampaAttrezzo(cout, attrezzo);
cout<<"Inserisci nome attrezzo: ";
cin.sync();
cin.getline(attrezzo.nome, 50);
cout<<"Inserisci quantita' disponibile: ";
cin>>attrezzo.quantita;
cout<<"Inserisci costo attrezzo: ";
cin>>attrezzo.costo;
cout<<"Inserisci note: ";
cin.sync();
cin.getline(attrezzo.note, 100);
stampaAttrezzo(cout, attrezzo);
aggiornaFile.seekp((cod-1)*sizeof(Record));
aggiornaFile.write(reinterpret_cast<const char*>(&attrezzo), sizeof(Record));
}
else
{
cerr<<"L'attrezzo con codice "<<cod<<" non e' presente nel file.\n";
}
}
void stampaAttrezzo(ostream &output, const Record &r)
{
output<<setiosflags(ios::left)<<setw(10)<<r.codice<<setw(25)<<r.nome<<setw(10)<<r.quantita<<setw(10)<<r.costo<<setw(50)<<r.note<<endl;
}
main.cpp
Codice:
#include "header.h"
int main()
{
fstream f("hardware.dat", ios::in | ios::out);
if(!f)
{
cerr<<"Errore\n";
}
int x;
char s;
do
{
cout<<"\nScegli un'opzione dal seguente menu':\n\n"
<<"1) Inserisci un attrezzo nel magazzino\n"
<<"2) Elenca gli attrezzi presenti in magazzino\n"
<<"3) Elimina un attrezzo non presente in magazzino.\n"
<<"4) Aggiorna le informazioni di un attrezzo.\n\n";
cout<<"Inserisci opzione: ";
cin>>x;
cin.sync();
switch(x)
{
case 1:
{
inserisciAttrezzo(f);
break;
}
case 2:
{
stampaMagazzino(f);
break;
}
case 3:
{
eliminaAttrezzo(f);
break;
}
case 4:
{
aggiornaAttrezzo(f);
break;
}
}
cout<<"\nVuoi effettuare un'altra operazione? (S/N): ";
cin>>s;
while(s!='s' && s!='S' && s!='n' && s!='N')
{
cout<<"Errore - Inserire una scelta corretta: ";
cin>>s;
}
}
while(s=='s' || s=='S');
cout<<"Fine Programma\n";
return 0;
}
Posso confermare (con varie prove che ho fatto) che ogni funzione viene eseguita correttamente, infatti posso inserire un attrezzo, stamparlo, eliminarlo e modificarlo, tutto correttamente... l'unico problema è che quando avvio il programma posso fare solo due funzioni alla volta: ad esempio apro il programma, inserisco un attrezzo e poi lo stampo, dopodichè non posso fare più nulla... le funzioni non vanno più; se però dopo aver chiuso il programma lo riapro e provo la funzione elimina, questa funziona, e poi è finita... devo riaprire il programma e fare ogni volta una o due funzioni alla volta.
Qualcuno potrebbe aiutarmi? Grazie mille.