Lettura stream da file

Catanzani1
Salve a tutti,
desideravo un piccolo consiglio su un programma per la lettura di un file .txt tramite un semplice programma in c++.

La lettura prevede semplicemente lo scorrere il file e restituire in output il suo contenuto. Il contenuto del file sono dei numeri, per cui le variabili sono dichiarate come double.

Quì il codice:


#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>

using namespace std;

int main() {

            fstream in_file;
            double tmp;

            in_file.open("/home/enrico/in.txt",ios::in);
                if(in_file.fail()) {
                       cout<<"\n\nError opening in.txt";
                       exit(1);
                }

            while(!in_file.eof()) {
                in_file>>tmp;
                cout<<"\n"<<tmp;
            }

            in_file.close();
            cout<<"\n\n";
            return 0;
}


Come vedete io sto utilizzando linux come sistema operativo per programmare e g++ come compilatore.

Il file in input in.txt è:

1
2
3
4


L'output che mi fuoriesce è:

1
2
3
4
4


Non riesco proprio a capire come mai l'eof non viene interpretato nel modo corretto; viene sempre visto un carattere in più, identico all'ultimo, prima di capire che il file è terminato.

Sapreste come aiutarmi?
So che questo programma è davvero banale e che questo poi alla fine non sia un grande problema, però il tutto è abbastanza seccante.

Ho provato con varianti di fstream come ifstream ma non cambia nulla, anche perchè sono la medesima cosa solo che non si esplicita il tag ios::in sull'apertura del file.

Grazie a tutti per la pazienza ed il tempo dedicatomi.

Buon week end.

Saluti

Enrico

Risposte
vict85
Ho fatto qualche piccola modifica. Il problema è che eof() diventa vero solo dopo che una lettura ha fallito. Quindi l'ultimo in_file>>temp; fallisce e non modifica temp che quindi mantiene il valore precedente che tu stampi. Ho inoltre eliminato un po' di codice usando un ifstream e aprendolo attraverso il costruttore.

#include <iostream>
#include <stdlib.h>
//#include <stdio.h> inutile
#include <fstream>

using namespace std;

int main() {

            ifstream in_file("/home/enrico/in.txt");
                if(!in_file) {
                       cout<<"\n\nError opening in.txt";
                       exit(EXIT_FAILURE);
                }

           double tmp;
            while(in_file>>tmp;) {
                cout<<tmp<<endl;
            }

            in_file.close();
            return 0;
}

Catanzani1
Ti ringrazio davvero molto per la celere risposta.

Grazie dei preziosi consigli e epsiegazioni.

Saluti

Enrico

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.