DPD ha scritto:
Ciao, ci sono due motivi per cui non funziona; [...]
Ciao
Ciao, e grazie per la risposta, non ci speravo più...
Cmq ho modificato, ma trovo altri problemi.
Apro il file con l'fstream sia in input che in output con le impostazioni ios::in | ios::out | ios::ate.
Vorrei tenere il puntatore fstream all'inizio del file, ma con la funzione open per non sovrascrivere bisogna per forza mettere ios::app o ios::ate.
Non capisco la differenza tra i due, visto che ognuno si posizione infondo al file cmq. Però con app il file non mi si apre, e neanche qui non capisco il perchè, quindi ho scelto di usare ate.
Quando dopo l'apertura, vado a leggere dal file i dati presenti, se ci sono vengono letti in modo non corretto. Ne deduco che abbia sbagliato qualcosa nella scrittura allora.
Se invece nel file non c'è niente, cmq legge ugualmente, nonostante il puntatore sia alla fine del file e abbia inserito la condizione !file.eof(), che dovrebbe uscire da, o non eseguire, il ciclo for.
Leggendo però info sulla funzione su cplusplus.com, essa verifica se è impostato il eofbit, che viene impostato quando si raggiunge la fine del file da una operazione di input. Visto che io di operazioni di input non ne ho fatte nessuna prima di verificare la condizione, il comportamento è normale.
Quindi decido di non effettuare nessuna lettura dei dati all'apertura del programma, ma farne una intera di tutto il file alla fine dopo aver inserito nuovi dati.
Modifico e faccio partire, inserisco i dati, ma la lettura non va.
Mi accorgo che non può essere fatta perchè il puntatore si trova alla fine del file dopo la scrittura, quindi con seekp() posiziono il puntatore all'inizio.
Non so proprio usare bene questa funzione, cmq deduco che se nel long che devo dare come parametro memorizzo 0, il file si va a posizionare all'inizio.
Ma come al solito sempre niente. Anzi, c'è di peggio, alla lettura windows mi chiude l'eseguibile per un errore.
A questo punto non ho la minima idea di come comportarmi.
Tra l'altro sono in questa situazione non perchè, io niubbio di file non mi sia documentato su di essi, ma che ci posso fare se il libro scolastico su cui studio parla per 10 pagine di file in C e dedica solo 2 pagine a come si gestiscono in C++??
Non ci sono degli esempi di lettura e scrittura, non ci sono degli esempi su come si utilizza la funzione seekp(), niente, c'è solo scritto l'elenco delle funzioni, come si legge e si scrive sul file (ma non come si visualizza a video), poi come si apre e chiude un file e basta.
Su internet ho cercato sul sito cplusplus.com, ma li parla di tutto, c'è anche un tutorial, ma guarda caso, che cosa non c'è in quest'ultimo? I File.
Ti prego anche di consigliarmi dei link utili sulla gestione dei file, soprattutto in italiano, ma vanno bene anche in inglese, grazie.
#include <iostream>
#include <fstream>
using namespace std;
struct nascita{
int aa, mm, gg;
};
struct dati{
char nome[20], cognome[20];
struct nascita data;
};
typedef struct dati persona;
persona abit;
fstream file;
void scrittura();
void inserimento();
int richiesta (int sx, int dx);
int main(){
file.open("Abitanti.txt", ios::in | ios::out | ios::ate);
if (file.is_open()){
inserimento();
long pos=0;
file.seekp(pos, ios::beg);
cout << "Dati presenti:\n";
scrittura();
}
else{
cout << "Si e verificato un errore nell'apertura del file.\n";
}
file.close();
cin.get();
return 0;
}
void scrittura(){
for (;!file.eof() ;){
file >> abit.cognome;
cout << abit.cognome << " ";
file >> abit.nome;
cout << abit.nome << " ";
file >> abit.data.gg;
cout << abit.data.gg << "/";
file >> abit.data.mm;
cout << abit.data.mm << "/";
file >> abit.data.aa;
cout << abit.data.aa << "\n";
}
}
void inserimento(){
for (; ;){
cout << "Introdurre il cognome dell'abitante (* per uscire):\n";
cin.getline(abit.cognome, 20);
if (abit.cognome[0]=='*') break;
file << abit.cognome;
cout << "Introdurre il nome di " << abit.cognome << ":\n";
cin.getline(abit.nome, 20);
file << abit.nome;
cout << "Introdurre la data di nascita di " << abit.cognome
<< " " << abit.nome << ".\n";
cout << "Giorno: ";
abit.data.gg=richiesta(1, 31);
file << abit.data.gg;
cout << "Mese: ";
abit.data.mm=richiesta(1, 12);
file << abit.data.mm;
cout << "Anno: ";
cin >> abit.data.aa;
while (abit.data.aa<0){
cout << "L'anno inserito non è esatto, riprovare...\n";
cin >> abit.data.aa;
}
file << abit.data.aa;
cin.ignore();
}
}
int richiesta (int sx, int dx){
int n;
cin >> n;
while (n<sx || n >dx) {
cout << "Puoi inserire ";
if (sx==dx) cout << "solo il numero " << sx << ": ";
else cout << "solo numeri compresi tra " << sx << " e " << dx << ": ";
cin >> n;
}
return n;
}
Buonanotte e grazie per ulteriori risposte.