Ciao, riprendo questa discussione perchè ho risolto il problema (però non penso sia la soluzione migliore).
In pratica, quando utilizzavo la funzione inserisci_attrezzo() aprivo l'oggetto ofstream con la modalità ios:
ut | ios::ate , ma questa modalità cancella l'intero file!
Ho avuto la conferma su questa discussione (che però non risolve il problema)
codice:
void inserisci_attrezzo(char* name1){
Record tool;
cout << "\nInserisci numero identificativo attrezzo: ";
cin >> tool.n_id;
cout << "Inserisci nome (usa il carattere di linea per lo spazio): ";
cin >> tool.nome;
cout << "Inserisci quantita': ";
cin >> tool.qnt;
cout << "Inserisci costo: ";
cin >> tool.costo;
cout << "Inserisci note: ";
getline(cin, tool.note);
ofstream f(name1, ios::out | ios::ate);
if(!f){
cout << "\nIl file non e' stato aperto!\n";
return;
}
f.seekp((tool.n_id-1)*sizeof(Record));
f.write(reinterpret_cast<const char*>(&tool), sizeof(Record));
f.close();
}
Ho risolto istanziando un oggetto fstream aperto in modalità standard, in modo che posso inserire dati all'interno del file senza che vengano distrutti quelli già esistenti:
codice:
void inserisci_attrezzo(char* name1){
Record tool;
cout << "\nInserisci numero identificativo attrezzo: ";
cin >> tool.n_id;
cout << "Inserisci nome (usa il carattere di linea per lo spazio): ";
cin >> tool.nome;
cout << "Inserisci quantita': ";
cin >> tool.qnt;
cout << "Inserisci costo: ";
cin >> tool.costo;
cout << "Inserisci note: ";
getline(cin, tool.note);
fstream f(name1);
if(!f){
cout << "\nIl file non e' stato aperto!\n";
return;
}
f.seekp((tool.n_id-1)*sizeof(Record));
f.write(reinterpret_cast<const char*>(&tool), sizeof(Record));
f.close();
}
Se apro il file con ios::app, i dati non vengono cancellati ma posso inserire i dati solo alla fine e non all'interno.
Secondo voi è la soluzione migliore? Conoscete una modalità di apertura in output che mi permette di inserire i dati all'interno del file senza cancellare i dati già presenti?