Il programma non funziona, quando vado a fare la lettura da file va in loop.
Ecco il codice:
codice:
/*
* ferramenta.h
*
*
*/
#ifndef FERRAMENTA_H_
#define FERRAMENTA_H_
using std::fstream;
struct Record{
int n_id;
int qnt;
float costo;
char nome[30];
char note[80];
};
Record record_vuoto();
void inizializza_file(fstream& );
void inserisci_attrezzo(fstream& );
void leggi_attrezzi(fstream& );
void stampa_attrezzo(const Record& );
void elimina_attrezzo(fstream& );
void aggiorna_attrezzo(fstream& );
#endif /* FERRAMENTA_H_ */
codice:
/*
* ferramenta.cpp
*
*
*/
#include <iostream>
#include <fstream>
#include <string.h>
#include <iomanip>
#include "ferramenta.h"
using namespace std;
void inizializza_file(fstream& f){
Record empty=record_vuoto();
f.seekp(0);
for(int i=0;i<100;i++)
f.write(reinterpret_cast<const char*>(&empty), sizeof(Record));
f.sync();
}
void inserisci_attrezzo(fstream& f){
Record tool;
cout << "\nInserisci numero identificativo attrezzo: ";
cin >> tool.n_id;
cout << "Inserisci nome: ";
cin.sync();
cin.getline(tool.nome, 30);
cout << "Inserisci quantita': ";
cin >> tool.qnt;
cout << "Inserisci costo: ";
cin >> tool.costo;
cout << "Inserisci note: ";
cin.sync();
cin.getline(tool.note, 80);
f.seekp((tool.n_id-1)*sizeof(Record));
f.write(reinterpret_cast<const char*>(&tool), sizeof(Record));
f.sync();
}
void leggi_attrezzi(fstream& f){
Record object;
cout << "\n\n" << setiosflags(ios::left) << setw(10) << "N. Record" << setw(25) << "Nome" << setw(10) << "Quantita'" <<
setw(10) << "Costo" << setw(50) << "Note" << "\n";
f.seekg(0);
f.read(reinterpret_cast<char*>(&object), sizeof(Record));
while(!f.eof()){
if(object.n_id!=0)
stampa_attrezzo(object);
f.read(reinterpret_cast<char*>(&object), sizeof(Record));
}
f.sync();
cout << "\n\n";
}
void stampa_attrezzo(const Record& r){
cout << setiosflags(ios::left) << setw(10) << r.n_id << setw(25) << r.nome << setw(10) << r.qnt <<
setw(10) << setiosflags(ios::fixed|ios::showpoint) << setprecision(2) << r.costo << setw(50) << r.note << "\n";
}
void elimina_attrezzo(fstream& f){
Record remove;
Record empty=record_vuoto();
int id;
cout << "\nInserisci il codice identificativo dell' attrezzo di cui vuoi controllare la quantita': ";
cin >> id;
f.seekg((id-1)*sizeof(Record));
f.read(reinterpret_cast<char*>(&remove), sizeof(Record));
if(remove.n_id==0){
cout << "L'attrezzo non esiste nell'elenco!\n";
return;
}
if(remove.qnt==0){
f.seekp((remove.n_id-1)*sizeof(Record));
f.write(reinterpret_cast<const char*>(&empty), sizeof(Record));
cout << "Oggetto mancante eliminato dall'elenco.\n";
}else cout << "Oggetto presente in magazzino!\n";
f.sync();
}
void aggiorna_attrezzo(fstream& f){
Record temp;
int id;
int opt;
cout << "\nInserisci numero identificativo dell'oggetto da aggiornare: ";
cin >> id;
f.seekg((id-1)*sizeof(Record));
f.read(reinterpret_cast<char*>(&temp), sizeof(Record));
if(temp.n_id==0){
cout << "Attrezzo non presente nell'elenco!\n";
return;
}
cout << "Vuoi cambiare il nome?(Se vuoi cambiarlo inserisci 0): ";
cin >> opt;
if(opt==0){
cout << "Inserisci nome: ";
cin.sync();
cin.getline(temp.nome, 30);
}
cout << "Vuoi cambiare la quantita'?(Se vuoi cambiarla inserisci 0): ";
cin >> opt;
if(opt==0){
cout << "Inserisci quantita': ";
cin >> temp.qnt;
}
cout << "Vuoi cambiare il costo?(Se vuoi cambiarlo inserisci 0): ";
cin >> opt;
if(opt==0){
cout << "Inserisci costo: ";
cin >> temp.costo;
}
cout << "Vuoi cambiare le note?(Se vuoi cambiarle inserisci 0): ";
cin >> opt;
if(opt==0){
cout << "Inserisci note: ";
cin.sync();
cin.getline(temp.note, 80);
}
cout << "Aggiornamento in corso . . .\n";
f.seekp((temp.n_id-1)*sizeof(Record));
f.write(reinterpret_cast<const char*>(&temp), sizeof(Record));
f.sync();
cout << "Aggiornamento completato.\n";
}
Record record_vuoto(){
Record r;
r.n_id=0;
r.qnt=0;
r.costo=0.0;
memset(r.nome, 0, 30);
memset(r.note, 0, 80);
return r;
}
codice:
/*
* main.cpp
*
*
*/
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include "ferramenta.h"
using namespace std;
int main(){
int m_opt;
fstream f;
cout << "Programma di test ferramenta\n\n\n";
f.open("hardware.dat", ios::out);
if(!f){
cerr << "\nFile non creato!\n";
system("PAUSE");
exit(1);
}
f.close();
f.open("hardware.dat", ios::in | ios::ate | ios::binary);
if(!f){
cerr << "\nFile non creato!\n";
system("PAUSE");
exit(1);
}
cout << "Inizializzazione file . . .\n";
inizializza_file(f);
cout << "Inizializzazione completata.\n";
do{
cout << "\n\n\nScegli un'opzione:\n1)Inserisci attrezzo nel file.\n2)Elenca attrezzi." <<
"\n3)Elimina attrezzo non presente in magazzino.\n4)Aggiorna dati attrezzo.\n5)Esci." <<
"\nInserisci opzione: ";
cin >> m_opt;
switch(m_opt){
case 1:{
inserisci_attrezzo(f);
break;
}
case 2:{
leggi_attrezzi(f);
break;
}
case 3:{
elimina_attrezzo(f);
break;
}
case 4:{
aggiorna_attrezzo(f);
break;
}
case 5:{
break;
}
default:{
cout << "Opzione non valida!\n";
break;
}
}
}while(m_opt!=5);
f.close();
system("PAUSE");
return 0;
}
Se apro il file in modalità ios:
ut invece che ios::ate la seconda volta, quando vado a leggere i dati su file non mi compare nulla su schermo. Penso che i dati non vengano scritti.