2 CFile-Objekte in unterschiedlichen Klassen == Zugriffsfehler



  • Moin,

    ich habe folgende stark vereinfachte Situation:

    class WriteLog
    {
    private:
        CString debug_file;
    public:
         Write(CString);
    };
    
    WriteLog::Write(CString text)
    {
        Datei öffnen;
        In Datei schreiben;
        Datei schliessen;
    }
    
    class FileManager
    {
    privat:
        CFile file;
        WriteLog log;
        void Öffnen();
        void Lesen();
    };
    
    FileManager::Öffnen()
    {
        Datei öffnen;
        Datei schliessen
        log.Write("Datei erfolgreich geöffnet);  <- Alles OK
    }
    
    FileManager::Lesen()
    {
        Datei öffnen;
        Datei auslesen;
        Datei schliessen;
        log.Write("Alles gelesen);   <- Verursacht Zugriffsfehler bei debug_file.Open(...)
    }
    

    Ich habe mal Variablen und unnötige Funktionen weggelassen.
    Die Variabelnamen in den beiden Klassen gleich sichauch kein Stück.

    Das Problem ist, dass ich mit der WriteLog() die ganze Zeit schön arbeiten kann und das zu jedem Zeitpunkt, egal ob ich gerade ne Datei geöffnet oder geschlossen habe.

    Doch wenn ich nach dem Auslesen einer Datei und dem anschließendem Schliessen wieder WriteLog() aufrufe, dann gibt er mir nen Zugriffsfehler zurück, sobald ich debug_file.Open mache.

    Tausendmal hat es funktioniert, nur seitdem eben auch aus einer Datei gelesen wird, stürzt er jetzt immer ab.

    Ich habe genaueren Quellcode mal weggelassen, da ich denke, dass ich irgendwo bei der Handhabung von CFile's etwas nicht beachte, da es vorher ja einwandfrei funktioniert hat.

    Jemand ne Idee??

    Danke im Voraus...

    Gruß
    chackie-lee



  • Ok, ich konnte das Problem ein wenig eingrenzen.

    int FileManager::GetData()
    {
    	CFile file;
    
    	log.SetDebug(DEBUG);
    	log.Write("!-- FileManager::GetData --!",TRUE);
    
    	if(file.Open(m_filename,CFile::modeRead | CFile::typeBinary)==0)
    	{
    		log.Write("Datei konnte nicht geöffnet werden",TRUE);
    		return(11);
    	}
    	file.Seek(m_fileposition, CFile::begin);
    	*m_paketSize = file.Read(&m_content, m_maxPacketSize); ->> Kern allen Übels	
    	m_fileposition = file.GetPosition();
    	file.Close();
    
    	log.Write("TEST",TRUE);
    	if(*m_paketSize==0)
    		return(13);	//13 --> Daten konnten nicht aus Datei eingelesen werden
    	return(0);
    }
    

    log ist von der Klasse WriteLog und folgendermaßen aufgebaut:

    class WriteLog  
    {
    public:
    	void SetSpace(int spaces);
    	void SetFileName(CString name);
    	WriteLog();
    	virtual ~WriteLog();
    	void Write(CString text, BOOL writeTime);
    	void SetDebug(BOOL u_debug);
    	BOOL GetDebug();
    
    private:
    	CString programHelp;
    	int space;  // Anzahl Leerzeichen, für visuelles Trennungen
    	CString program;
    	CConvertTyp convert;
    	CString debug_filename;
    	BOOL debug;
    
    };
    

    Im Konstruktor wird jeder einzelnen Variabel ein Wert zugewiesen!

    Wenn ich jetzt mit file.Read etwas auslese und danach log.Write(..) aufrufe, sind in der WriteLog alle Variabeln leer bzw. 0.
    Deswegen kann er auch nicht auf die Log-Datei zugreifen, da der Path angeblich "" ist.

    Vorm dem file.Read sind noch alle Daten in dem WriteLog-Objekt log vorhanden, danach nichts mehr.
    Es gibt keinerlei Zugriff auf diese Daten und sie sind selbstverständlich alle private.

    Ich bin echt am Verzweifeln und bin kurz davor mir nen Buch über Hexerei oder ähnliches zu kaufen.

    Bitte helft mir....

    Gruß und Dank
    chackie-lee



  • Ach kommt schon, hat denn wirklich keiner auch nur eine kleine Ahnung, warum file.Read() mir mein WriteLog()-Objekt zerschießt??

    Gruß
    chackie-lee



  • Was genau ist m_content?



  • Moin,

    m_content ist ein char* auf ein char content[1024], das in einer übergestellten Klasse definiert ist und dessen Adresse in der FileManager.Init(...) übergeben und gesetzt wird.



  • chackie-lee schrieb:

    m_content ist ein char*

    Dann solltest du nicht die Adresse dieses Zeigers übergeben, sondern den Zeiger selbst.



  • Ohh das stimmt, dummer Fehler.

    Leider hat es aber nichts gebracht.

    Beim nachfolgendem Aufruf von log.Write(...) stürzt das Programm wieder ab, weil im Objekt log danach jede einzelne Variabel uninitialisiert ist. (also keine Werte beinhaltet).

    Mit verzweifeltem Gruß
    chackie-lee



  • *m_paketSize = file.Read(&m_content, m_maxPacketSize); ->> Kern allen Übels
    

    Warum ist m_paketSize nen Pointer?
    Warum keine einfache Variable? Ist doch nur nen unsigned int.



  • Problem behoben.
    m_content war überhaupt kein char-array, sondern ein CString, wie peinlich....

    Falls hier jemand Ordnung hält, dieser Beitrag kann ruhig gelöscht werden!

    Gruß
    chackie-lee


Log in to reply