Fehler(?!) von std::ifstream - Oder doch die Geschwindigkeit?



  • Hallo,

    bei meinem aktuellen Projekt lade ich zunächst eine Datei komplett in einen std::vector<char> data, um dann mit diesem weiterzuarbeiten.
    Nun ist mir aufgefallen, das data nach dem Laden der Datei keinerlei Daten enthält.
    Hier zunächst mein dazugehöriger Code:

    bool SffV2::ReadFile(std::ifstream& myfile,std::vector<char>& data)
    {
    	data.clear();//superfluous but whatever
    	int length;
    	myfile.seekg(0,std::ios::end);
    	length = myfile.tellg();
    	if(length > -1)//->no error
    	{
    		myfile.seekg(0,std::ios::beg);
    		data.reserve(length);//changes vectorsize to >=datalength
    #ifdef DEBUG
    		SetError(INFO,"In Func:ReadFile vector data's length is-"+error::IntToString(data.capacity()));
    		SetError(INFO,"Ifstream state is EOF:"+error::IntToString(myfile.eof())+",BAD:"+error::IntToString(myfile.bad()) + ",Open:"+ error::IntToString(myfile.is_open()));
    #endif
    
    				 myfile.read(&data[0],length);
    				 std::cout << myfile.gcount() << std::endl;
    //...
    //bissl debugausgabe weggelassen
    }
    

    Das letzte myfile.gcount() gibt aus, das die gesame Datei eingelesen worden ist(da es die exakte Länge der Datei anzeigt).
    Laut meinem Errorlogger hat weder der ifstream einen Fehler fabriziert(bad ==0) noch ist die Datei unerwartet "am Ende" gewesen(denn EOF == 0), auch ist sie direkt vor dem Lesen der Daten offen(is_open()==true).

    Mein Errorlog der NACH der letzten hier geposteten Zeile kommt wird aufgerufen, daher habe ich angenommen, das myfile.read(...) abgeschlossen ist.
    Dennoch zeigt mir data.size() Null an.

    Ich habe eben als Test mal die Daten einzeln via myfile.get() eingegeben und mir in jedem Schritt die gegenwärtige Bytenummer ausgeben lassen(also den index) und daraus konnte ich ersehen, dass das Auslesen der Daten seeeehr lange braucht.
    Etwa in der Höhe von >100 Sekunden(!).
    Mache ich was falsch, oder ist das wirklich so langsam?

    Und falls das Auslesen wirklich so langsam ist, wieso läuft der Code dann weiter?!

    Vielen Dank für eure Hilfe 🙂



  • Dateigröße ist übrigens ca. 900 KB, also eigentlich nicht sonderlich groß



  • Du änderst in dem gezeigten Code die Vectorgrösse nicht, warum sollte sie also ungleich 0 sein? Vielleicht solltest du resize statt reserve verwenden.



  • 😃 verdammt, du hast recht. Und da dachte ich ich hätte in meiner C++ Abstinenz nicht vergessen^^ sehr gut, das es einfach dummheit war 🙂

    Danke


Anmelden zum Antworten