Ragazzi c'ho da fare questo programma. La traccia è:
Siete il proprietario di una ferramenta e avete bisogno di mantenere un inventario che possa dirvi quali e quanti attrezzi avete e il costo d'ognuno di essi. Scrivete un programma che inizializza il file con 100 record vuoti, vi consenta di immettere i dati relativi a ogni attrezzo, vi dia la possibilità di elencarli tutti, vi lasci eliminare un record per un attrezzo che non avete più, e vi permetta di aggiornare qualsiasi informazione nel file. Il numero di identificazione dell'attrezzo sarà anche quello del record. Usate le seguenti informazioni, come dati iniziali per il vostro file:
Record n° Nome attrezzo Quantità Costo
3 Martello 7 57.98
Ce ne sono anche altri di dati ma non li scrivo. Il programma non l'ho fatto per intero ma ho solamente inizializzato il file con i record vuoti, ho immesso dei dati, e il prog. me li dovrebbe visualizzare in un file "print.txt", scartando i record che hanno 0 come valore ovviamente. Qualcosa va storto ma non so cosa: questo è il codice. Il prog. si potrebbe fare anche con le classi però al momento mi accontento di farlo in un unico file con una struct. Per le altre funzioni cercherò di implementarle ma solo dopo aver corretto questi errori.
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <iomanip>
#include <string>
using namespace std;
struct Ferramenta
{
int ID;
string nome;
int quantita;
float costo;
};
void output (ostream& out, const Ferramenta& Fer);
void textFile (fstream& readFromFile);
int main ()
{
fstream File ("hardware.dat", ios::out | ios::in);
if (!File)
{
cerr << "File could not be opened." << endl;
exit(1);
}
Ferramenta Fer = { 0, "", 0, 0.0 };
for (int i = 0; i < 100; i++)
File.write( reinterpret_cast <const char*>(&Fer), sizeof(Ferramenta));
cout << "Inserisci il numero di record (da 1 a 100, 0 per uscire)\n? ";
cin >> Fer.ID;
while (Fer.ID > 0 && Fer.ID <= 100)
{
cout << "Inserisci nome dell'attrezzo, la quantità e il costo\n? ";
cin >> Fer.nome >> Fer.quantita >> Fer.costo;
File.seekp( (Fer.ID - 1) * sizeof(Ferramenta) );
File.write( reinterpret_cast <const char*>(&Fer), sizeof(Ferramenta) );
cout << "Inserisci il numero di record\n? ";
cin >> Fer.ID;
}
textFile (File);
system ("pause");
return 0;
}
void output (ostream& out, const Ferramenta& Fer)
{
out << endl << setw(15) << setiosflags(ios::left) << Fer.ID
<< setw(25) << Fer.nome << setw(15) << Fer.quantita
<< setw(5) << Fer.costo;
}
void textFile (fstream& readFromFile)
{
ofstream outPrintFile("print.txt", ios::out);
if (!outPrintFile)
{
cerr << "File could not be opened." << endl;
exit(1);
}
outPrintFile << setiosflags(ios::left) << setw(15) << "Record n°"
<< setw(25) << "Nome attrezzo" << setw(15) << "Quantita'"
<< setw(5) << "Costo";
readFromFile.seekg(0);
Ferramenta fer;
readFromFile.read( reinterpret_cast <char*>(&fer), sizeof(Ferramenta) );
while ( !readFromFile.eof())
{
if (fer.ID != 0)
output (outPrintFile, fer);
readFromFile.read( reinterpret_cast <char*>(&fer), sizeof(Ferramenta) );
}
}
Il problema è che se eseguo il programma e immetto un solo dato il dato viene visualizzato correttamente. Se ne immetto più di uno nel file print.txt invece stampa caratteri strani. Perchè? Grazie...