.dat datei auslesen
-
hallo
ich bin neu hier
hab ein problem beim auslesen einer .dat datei
in der dat datei sind bsp. sind die ersten 10 zahlen in einer spalte.
mein code ist:#include<iostream> #include<fstream> #include<iomanip> int main(){ double temp; ifstream myfile("data.dat", ios::in); if (myfile.good()) { myfile.seekg(0L, ios::beg); while (!myfile.eof()) { myfile >> temp if ( !myfile.fail()){ cout << temp << endl; } } } else cout << "Error! Can not read out data.dat" << endl;mein problem ist nun, dass ich das programm die letzte zahl 2 mal ausgibt.
wenn ich meine ausgabe cout << temp << endl;
mit einer if ( !myfile.fail()) abfrage umgebe, dann klappts.
ich wollte trotzdem mal fragen was da los ist, denn ich versteh nicht wirklich die einzelnen codeteile; habs eher aus einem buch gestohlen
ok sry falls der code so schlecht lesbar ist
bin in c nicht so fit und im forum auch nicht
okay liebe grüße & danke
Edit: Codetags hinzugefügt - evilissimo
-
beim auslesen des letzten double ist er wahrscheinlich noch nicht bei eof und versucht dann nochmal ein double zu lesen, was dann failed.
-
ja genau
while(!myfile.eof())
ist bei fstream nicht das was es bei anderen verfahren ist. das eof flag wird erst gesetzt wenn er die nächsten bytes lesen will aber nichts mehr da ist. der inhalt in while wird nochmal ausgeführt obwohl er nichts mehr auslesen kann.
-
mhh
das versteh ich eigentlich nicht so ganz
und wie kann man das ändern?
wenn ich eine do schleife mach dann klappts auch nicht
-
Phecda schrieb:
mhh
das versteh ich eigentlich nicht so ganz
und wie kann man das ändern?
wenn ich eine do schleife mach dann klappts auch nichtDas heißt, Du solltest erst die Zahl lesen und danach erst prüfen, ob das Lesen ok war. Das EOF-Flag ist nicht zuverlässig, ob die letzte Zahl gelesen wurde oder nicht. Das hängt davon ab, ob hinter der letzten Zahl noch Leerzeichen kommen oder direkt das Dateiende. Mache einfach:
#include <iostream> #include <fstream> int main() { using namespace std; ifstream myfile("data.dat"); if( myfile.good() ) { for( double temp; myfile >> temp; ) { cout << temp << endl; } } else cout << "Error! Can not read out data.dat" << endl; return 0; }Gruß
Werner
-
hi
okay so funtioniert das sehr gut:-)
das mit der for sieht ja echt cool aus, hab gar nicht gewusst, dass man sowas machen kann. wird die temp datei immer wieder neu angelegt? kann ich da beliebig viele anweisungen reinschreiben?kurz noch ne frage, weil ich neu bin
wie tut ihr immer die codes extra so darstellen?
-
Mittels den C++ Tags.
Siehe unter den Smilies da steht ein Kasten, in dem Steht "C/C++" klickst du dort einmal drauf, wird ein Tag geöffnet, du postest dein Code und wenn du fertig bist, klickst du einfach nochmal drauf dann wird er wieder geschlossen
Für nähere Infos schau mal in den FAQ