Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Moin Moin...

Habe mir eine Logfile Klasse geschrieben die beim Erzeugen eines Objekts der Klasse Logfile automatisch (mit fopen) ein Logfile im Verzeichniss der Exe-Datei erstellt.

Jetzt möchte ich aber einen anderen Pfad verwenden, zum Beispiel "/Logfile/Logfile.html" ... wenn ich dies an den Befehl fopen übergebe:


m_Logfile = fopen ("/Logfile/Logfile.html", "w");

... erhalte ich eine Assertion und das Programm bricht ab.

Kann mir jemand sagen wie ich das anstelle?

Hab schon bei Google etc. und mit der Forensuche gesucht aber nichts passendes gefunden...

Geschrieben

Folgendes wird ausgegeben:

Debug Assertion Failed!

Program: [Der Pfad der Exe]

File: fprintf.c

Line 56

Expression: str != NULL

For Information on how your program can cause an assertion failure,

see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

Geschrieben

Tja, der Witz an der Sache ist:

Wenn ich den Parameter von fopen verändere (also statt nem Pfad einfach nur "logfile.html" schreibe) funtzt alles bestens!

Will aber nunmal nicht im Verzeichniss der Exe das Logfile erstellen, sondern im Unterordner "Logfile"

Geschrieben
Wenn ich den Parameter von fopen verändere (also statt nem Pfad einfach nur "logfile.html" schreibe) funtzt alles bestens!
Vermutlich, weil fopen dann nicht fehlschlägt. Wenn kein Auto kommt, "funzt" auch bei Rot über die Straße gehen.

Eine Fehlerprüfung wäre also auf jeden Fall angebracht.

Will aber nunmal nicht im Verzeichniss der Exe das Logfile erstellen, sondern im Unterordner "Logfile"
Dann solltest du vielleicht einen relativen Pfad benutzen. Der fängt im Allgemeinen nicht mit einem Schrägstrich an. Denk aber daran, dass sich relative Pfade auf das aktuelle Arbeitsverzeichnis deines Programms beziehen. Das muss nicht das Verzeichnis sein, in dem sich die ausführbare Datei befindet.
Geschrieben

kannst du mir ein kleines Stück Beispielcode geben?

Dem besseren Verständniss wegen poste ich einfach mal meinen Konstruktor:


CLogfile::CLogfile(const char *LogName) //Aufgabe: Logfile erzeugen

	{



		//Logfile leeren und Kopf schreiben

		m_Logfile = fopen ("/Logfile/Logfile.html", "w");

		fett_text (LogName);

		absatz();

		absatz();

		fflush (m_Logfile);


		//Aktuelle BuildKonfiguration ausgeben

		#ifdef _DEBUG

			fett_text("Buildversion: "); 

			eingerueckt_text ("DEBUG");

		#else

			fett_text("Buildversion: "); 

			eingerueckt_text ("RELEASE");

		#endif


		//Logfile schliessen und mit append wieder öffnen

		fclose (m_Logfile);

		m_Logfile = fopen ("/Logfile/Logfile.html", "a");


	}; 

Geschrieben

Mit einer absoluten Pfadangabe (z.B. "m:/test/Logfile.html") funktioniert es bestens... nur die relative Pfadangabe will nicht so...

Gibt es also eine Möglichkeit das mit relativer Pfadangabe zu machen?

Geschrieben
Gern geschehen :)

Trotzdem solltest du immer prüfen, ob fopen erfolgreich war. Es gibt auch Gründe für ein Fehlschlagen, die nicht in deinem Code liegen.

Richtig :)

Das Problem beim fopen lag an der Pfadangabe:

Da der Ordner Logfile unter / nicht exisitierte bzw. du die Berechtigungen nicht hast, das File in dem Order zu erzeugen , geht der fopen schief.

Hier solltest du prüfen ob du berechtigt bist, um Dateien zu erzeugen bzw. zu lesen und dann erst den fopen durchzuführen. (den fopen natürlich auch mit Prüfung)

Ok... Problem gelöst!

Der relative Pfad muss in dieser Form angegeben werden: "Test/Logfile.html"...

ACHTUNG:

Solch ein Coding ist ein erhebliches Sicherheitsrisiko. Wenn das Programm später mal unter einem User läuft der "wichtige" Systemberechtigungen hat (evtl. mit s-Bit) dann kann man mit so einem fopen das System manipulieren.

1. Durch verschieben des Binaries

2. Durch erzeugen von Symlinks auf Test/Logfile.html

3. etc..

Bitte verwende absolute Pfadangaben wie z.B. /meinprogram/Test/Logfile.html

Nur ein Tipp :)

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...