PDA

Visualizza la versione completa : [c++]stampa a video, da file, doppia


cleaner
03-01-2009, 20:54
Il codice che vi propongo ora mi legge in un file di testo delle stringhe, a queste stringhe viene associata l'estensione, in questo modo posso aprire i file singoli e l'obbiettivo Ŕ stamparne a video il contenuto...
La funzione di per se funziona, tuttavia non riesco a capire perchŔ mi doppia l'ultimo dato;
i file singoli hanno questa struttura:
etÓ:14
scuola:xxxx
celibe:si

ecc ecc.. ovviamente i dati li ho inventati sul momento.. ^^


void tot()
{
int j=0;
totalunni = "totalunni.txt"; //file che contiene le stringhe associate al singolo alunno
fstream totalunni (totalunni.c_str(),ios::in);
while(totalunni)
{
totalunni.getline(riga_letta[j++],MAX_LINE_LEN);

}
totmatricole.close();
for(int y = 0 ; y < j-1 ; y++)
{

x = riga_letta[y];
x=x+".txt";

fstream stampa_alunno(x.c_str(),ios::in);
while(stampa_alunno)
{
stampa_alunno >> z;
cout << z << endl;
}
}


l'output Ŕ di questo genere:

id:4522
nome:peter
cognome:griffin
luogo:roma
luogo:roma

viene ripetuto 2volte l'ultimo dato O_o in quale punto del ciclo sbaglio?? :master: grassie

cleaner
04-01-2009, 22:28
up..almeno un vaga idea del perchŔ di questo errore?! :master:

MItaly
04-01-2009, 23:05
while(!stampa_alunno.eof())
{
stampa_alunno >> z;
cout << z << endl;
}

cleaner
05-01-2009, 10:40
ehm ^^


while(!stampa_alunno.eof())
{
stampa_alunno >> z;
cout << z << endl;
}


il ciclo viene eseguito fino alla fine del file(eof), e ad ogni iterazione viene assegnato alla variabile z il contenuto dell'oggetto di flusso stampa_alunno, dopodichŔ viene stampata a video z.. non capisco dove sbaglio..
:bh˛:
forse l'ho interpretato male io il code..grazie ^^

oregon
05-01-2009, 11:10
Originariamente inviato da cleaner
ehm ^^

Non ho capito se l'hai provato come ti ha suggerito di modificare il ciclo MItaly ... e se hai ancora il problema ...

cleaner
05-01-2009, 11:26
ho ritentato un'altra volta ma con la propietÓ .eof() va addirittura in ciclo infinito..
l'ultimo dato, nell'esempio postato Ŕ:
luogo:roma
viene ripetuto infine volte..non riesco propio a capire dove sta l'errore..qualche idea?!altrimenti se avete una soluzione diversa per prendere in input ogni linea e stamparla a video.. :bh˛:

la procedura che dovrebbe fare la funzione Ŕ questa:

1) Prende da un file delle linee --> ex. 1234
2) aggiunge alle linee una estensione, quindi di fatto diventa una stringa --> ex 1234.txt
3) la stringa la uso per aprire i file singoli, a video devo stamparne pi¨ di uno, funziona, solo la rindondanza di quel dato non ha senso O_o

oregon
05-01-2009, 11:31
Prova cosi'



fstream stampa_alunno(x.c_str(),ios::in);
stampa_alunno >> z;
while(stampa_alunno)
{
cout << z << endl;
stampa_alunno >> z;
}

cleaner
05-01-2009, 11:47
:zizi: funzica ^^ per˛ sinceramente non ho capito bene il perchŔ della seconda istruzione, provo a commentarla:



fstream stampa_alunno(x.c_str(),ios::in); //apro il file in lettura
stampa_alunno >> z; // nella variabile di tipo string z, finisce la prima riga
while(stampa_alunno)
{
cout << z << endl; // stampo la prima riga presa, di fatto quello contenuto in z
stampa_alunno >> z; // prendo la riga successiva e la pongo in z
}



mmm..
:master:
quindi in pratica prendo la riga fuori dal ciclo e la stampo dentro, solo che non capisco il perchŔ di due istruzioni di input stampa_alunno >> z

Un'ultima cosa, in questo modo per˛ mi stampa tutto a video, "attaccato", se io sapessi quanti sono i campi, posso di fatto intercettare la linea e piazzarci un bel carattere separatore..avevo pensato ad una cosa del genere:



int conta_righe=0;
fstream stampa_alunno(x.c_str(),ios::in);
stampa_alunno >> z;
while(stampa_alunno)
{
conta_righe ++;
if(conta_righe < 7) cout << z << endl; //7campi per ogni alunno
else cout << "*********"; //inserisco un carattere che separa i dati da un alunnno all'altro
stampa_alunno >> z;
}



grassie mille in anticipo


:D

Loading