View Single Post
Old 14-04-2011, 15:05   #2
TheBestNapoli
Junior Member
 
Iscritto dal: Mar 2011
Messaggi: 21
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.
TheBestNapoli è offline   Rispondi citando il messaggio o parte di esso