PDA

Visualizza la versione completa : [C++] Carattere in più nello stream letto da file


ale92_
05-06-2012, 19:04
salve a tutti vi scrivo oggi perchè ho un problema veramente strano a cui non riesco proprio risolvere.
sto studiando c++ per un esame, non è il linguaggio che uso di solito ma non ho avuto grandi problemi.
il fatto è questo...devo leggere un file .txt "criptarlo" tramite una matrice e scriverlo in un altro .txt poi infine visualizzarli entrambi a schermo...un gioco da ragazzi direte voi, così pensavo anche io.
scrivo il programma, l'algoritmo nel complesso funziona quando per caso noto che nel testo criptato c'erano 2 lettere in più; a questo punto faccio andare istruzione per istruzione una alla volta e vedo che quando vado a leggere carattere per carattere con questa funzione :


char a;
fstream stampa;
stampa.open(nome, ios::in);
while(!stampa.eof())
{
stampa.get(a);
cout << a;
}
cout << endl;
stampa.close();
guardando lo stream alla fine del file c'è un doppione dell'ultima lettera e quindi quando va a criptare aggiunge una lettera e quando lo visualizza ne aggiunge un altra.

non vedo nulla di strano nella funzione che ho scritto però ho notato che se metto semplicemente stampa >> a, non lo stampa (nello stream c'è lo stesso però è come se non lo contasse), però visto che >> ignora gli spazi ho dovuto usare la get

vi posto uno screenshoot di quello che vedo
http://img507.imageshack.us/img507/3112/immaginetm.jpg

avete qualche idea???

ps. qui uso visual studio ma ho fatto la prova anche con dev c++ e da lo stesso "errore"

oregon
05-06-2012, 19:16
Imposta così il ciclo



stampa.get(a);
while(!stampa.eof())
{
cout << a;
stampa.get(a);
}

ale92_
05-06-2012, 19:18
grazie per la risposta velocissima...comunque più che la soluzione cercavo una spiegazione del perchè accade

oregon
05-06-2012, 19:25
Semplice ... la feof diventa vera solo *dopo* una get che fallisce, ma a quel punto hai già visualizzato il carattere precedente

ale92_
05-06-2012, 19:52
ok tutto chiaro...dopo aver letto la tua risposta ho pensato anche a un altra modifica


while(stampa.get(a);)
{
cout << a;
}
d'ora in poi userò questa di condizione penso sia più "sicura"

Loading