.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 nicht

    Das 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


Anmelden zum Antworten