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.