fstream - Liefert Dateilänge -1 zurück



  • Folgende Funktion soll eine Konfigurationstextdatei auslesen:

    !!!Achtung, bloß nicht versuchen den Quelltext in irgendeiner Form zu kompilieren und Auszuführen. Das Ding ist gemeingefährlich! 🕶 Weiteres dazu steht unten.

    #ifndef _FSTREAM_
    #define _FSTREAM_
    #include <fstream>
    #endif
    
    #include "AufloesungLaden.h"
    #include "FenstermodusLaden.h"
    #include "AILevelLaden.h"
    #include "GamespeedLaden.h"
    #include "GewinnpunkteLaden.h"
    using namespace std;
    #include <iostream>
    
    bool KonfigurationenLaden(int* ScreenX, int* ScreenY, bool* windowed, int* AILevel, int* Gamespeed, int* Gewinnpunkte)
    {
    //Konfiguration laden
    int configLaenge = 0;
    char AktuellesTextstueck[20];
    int Position = 0;
    bool AllesErfolgreichGeladen = false;
    bool AllesErfolgreichGeladen1 = false;
    bool AllesErfolgreichGeladen2 = false;
    bool AllesErfolgreichGeladen3 = false;
    bool AllesErfolgreichGeladen4 = false;
    bool AllesErfolgreichGeladen5 = false;
    
    //config.txt auslesen
    ifstream Konfiguration("config.txt", ios::in);
    
    //Länge der Datei ermitteln
    Konfiguration.seekg(0, ios_base::end);
    configLaenge = Konfiguration.tellg();
    
    //An Beginn springen
    Konfiguration.seekg(0, ios_base::beg);
    printf("Bin vor der Schleife!\n");
    cout << Position + 20 << " ist doch gleich kleiner als " << configLaenge << ".\n";
    
    while (!Konfiguration.eof())
    {printf("Und darin!\n");
    	//20 Zeichen langes Textstück auslesen + Null-Zeichen anfügen
    	for (int textpos = 0; textpos < 20; textpos++)
    	{
    		AktuellesTextstueck[textpos] = Konfiguration.get();
    		Konfiguration.seekg(1, ios_base::cur);
    	}
    	//AktuellesTextstueck[20] = '\0';
    
    	//Auslesen
    	printf("Gleich kommt die Aufloesungsfunktion!\n");
        AllesErfolgreichGeladen1 = AufloesungLaden(&Position, AktuellesTextstueck, ScreenX, ScreenY);
    	printf("Und vorbei!\n");
    	AllesErfolgreichGeladen2 = FenstermodusLaden(&Position, AktuellesTextstueck, windowed);
    	AllesErfolgreichGeladen3 = AILevelLaden(&Position, AktuellesTextstueck, AILevel);
    	AllesErfolgreichGeladen4 = GamespeedLaden(&Position, AktuellesTextstueck, Gamespeed);
    	AllesErfolgreichGeladen5 = GewinnpunkteLaden(&Position, AktuellesTextstueck, Gewinnpunkte);
    
    	//Weitersetzen, damit nächster Textabschnitt ein Zeichen nach letzem beginnt
    	Position++;
    	Konfiguration.seekg(Position, ios_base::beg);
    }
        //config.txt schließen
    	Konfiguration.close();
    
    	//Auf Fehler beim Laden überprüfen
    	if(AllesErfolgreichGeladen1)
    	{
    	    if(AllesErfolgreichGeladen2)
    	    {
    	        if(AllesErfolgreichGeladen3)
    	        {
    	            if(AllesErfolgreichGeladen4)
    	            {
    	                if(AllesErfolgreichGeladen5)
    	                {
    	                    AllesErfolgreichGeladen = true;
    	                }
    	            }
    	        }
    	    }
    	}
    
    return AllesErfolgreichGeladen;
    }
    

    Folgendes:

    //Länge der Datei ermitteln
    Konfiguration.seekg(0, ios_base::end);
    configLaenge = Konfiguration.tellg();
    

    Liefert mir ja eigentlich die Länge einer Textdatei zurück. Aber aus irgendeinem Grund setzt es configLaenge auf -1. Damit als Vergleichsparameter startete das Auslesen überhaupt nicht. Also wollte ich das Auslesen mit:

    while (!Konfiguration.eof())
    

    auf die Länge der Textdatei beschränken.

    Kompiliere ich jetzt aber mein Programm, so läuft es in einer Dauerschleife und die Festplatte wird die ganze Zeit beansprucht. Zum Glück hab ich es nach 30 Sekunden Not-beendet, denn in den 30 Sekunden hat es mir schon eine 1,37 GB große Textdatei mit den printf und cout-Befehlen ausgespuckt. Auch laufen seitdem bei mir ein Haufen cmd.exe Prozesse, die möglicherweise auch von meinem Programm hervorgerufen wurden. Ich starte meinen Rechner jetzt erstmal neu, um das alles zu bereinigen.

    Sieht jemand meinen Fehler? Vor allem, warum die Dateilänge nicht bestimmt werden kann. Die Datei config.txt ist in dem Ordner, in dem auch die .exe landet.



  • Ich vermisse eine Abfrage ob die Datei überhaupt korrekt geöffnet werden konnte:
    if (!Konfiguration.good()) bla



  • Mein Programm macht immer ganz komische Sachen, sieht jemand vielleicht den Fehler?

    #include "Foooooo.h"
    
    int main()
    {
        Foo();
        return 0;
    }
    


  • Stimmt, das der Fehler gleich da liegt, soweit habe ich nicht gedacht. Ja, mit einem:

    //Testen ob geladen werden konnte
    if (!Konfiguration.good())
    {
        printf("Datei konnte nicht geöffnet werden\n");
        return false;
    }
    

    Nach dem Erstellen des Streams steht in der stdout.txt:

    Datei konnte nicht geöffnet werden
    config.text konnte nicht korrekt eingelesen werden!
    

    Hab gerade ausführlich gegoogled und mein Problem gefunden. Da hätte ich ewig suchen können. Hier in diesem Forum:

    http://powerforen.de/forum/showthread.php?t=230106#

    In diesem speziellen Beitrag:

    http://powerforen.de/forum/showpost.php?s=a885acafcd52a3d40ac58268d8d4fa3a&p=2168757&postcount=7

    Meine "config.txt" hieß "config.txt.txt". Windows hat die zweite Endung nicht angezeigt und ich wär wohl auch nie selbst drauf gekommen, dass im Normalfall gar keine Endung zu sehen sein sollte.

    Sorry, dass ich jetzt wegen dem Problem gefragt habe. Ich dachte aber echt, es wäre ein Fehler im Quelltext.


Anmelden zum Antworten