Lettura stream da file
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:
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
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
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; }
Ti ringrazio davvero molto per la celere risposta.
Grazie dei preziosi consigli e epsiegazioni.
Saluti
Enrico
Grazie dei preziosi consigli e epsiegazioni.
Saluti
Enrico