Hai fatto un bel minestrone.
In linea generale il main dovrebbe limitarsi solo a chiedere cosa si vuole fare; altre cose non sono di sua pertinenza.
Il file che apri nel main viene chiuso solo quando il programma esce, quindi c'è rischio serio di corruzione dati. Inoltre "inizializzi" (?) il file con 100 strutture vuote (e che serve?) e c'è la funzione record_vuoto() il cui scopo è dubbio.

Il tuo main dovrebbe limitarsi a chiedere: che vuoi fare? E chiamare la funzione corrispondente.
Sarà la funzione a prendersi carico di gestire il file interno. Similmente le altre funzioni faranno quello che devono fare, ma sapendo di poter elaborare un file consistente e non corrotto di dati.
Il main dovrà essere qualcosa del genere: (nota che ho tolto le system() che non digerisco e la string la uso per comodità).
codice:
int main(int argc, char* argv[] ) {
	cout << "Programma di test ferramenta\n\n\n";
	string myFile = "hardware.dat";
	int m_opt;
	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;
		cin.sync();
		switch(m_opt){
		case 1:{
			inserisci_attrezzo(myFile);
			break;
		}
		case 2:{
			leggi_attrezzi(myFile);
			break;
		}
		case 3:{
			elimina_attrezzo(myFile);
			break;
		}
		case 4:{
			aggiorna_attrezzo(myFile);
			break;
		}
		case 5:{
			break;
		}
		default:{
			cout << "Opzione non valida!\n";
			break;
		}
		}
	}while(m_opt!=5);

}
Alle funzioni devi passare il nome del file, non lo stream. Sarà la funzione a fare quel che deve fare. Ad esempio la inserisci_attrezzo()
codice:
void inserisci_attrezzo(const string& file);

void inserisci_attrezzo(const string& file){
        // non serve nessuna record_vuoto(). La struttura è riempita del tutto qui.
	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);
        // Creando il file in append, se non esiste viene creato, altrimenti il record è messo alla fine
	ofstream f(file.c_str(), ios::out | ios::app | ios::binary);
	if (!f) {
		cout << "errore nella creazione del file" << endl;
		return;
	}
        // si scrive il record.
	f.write(reinterpret_cast<const char*>(&tool), sizeof(Record));
        // opzionalmente si può mettere f.close(). Il file comunque è chiuso quando la funzione esce.
       // f.close();
}