Nach drei Monaten Pause habe ich nun alten Programmcode auf einem
Raspberry Pi wieder versucht zum Laufen zu bekommen und eigentlich läuft
auch alles.
Aber das Programm soll beim Start überprüfen, ob ein Logfile existiert
und falls das nicht nicht der Fall ist soll dieses erstellt werden.
Das hat so auch schon geklappt, das Programm lief letztes Jahr
einwandfrei.
Aber jetzt klappt das irgendwie nicht mehr und nach einem kompletten Tag
Fehlersuche stehe ich mal wieder auf dem Schlauch.
Der Programmcode (für den ich hier auch schonmal um Hilfe gebeten hatte)
ist folgender:
Dieser kleine Code ist ja nun nicht spektakulär, aber er tut nicht wie
ich will, und ich habe keine Ahnung was ich verändert haben könnte. Ich
wusste nichtmal, dass ich (seit es funktioniert hat), überhaupt noch was
geändert habe.
Also das Programm wird jedenfalls problemlos kompiliert und ausgeführt
und auch der oben zu sehende Codeblock wird ausgeführt (wenn ich ein
printf dazwischen packe wird es ausgeführt).
Aber nicht die If-Abfrage! Ob nun eine Datei mit dem angegebenen Namen
in dem Verzeichnis existiert oder nicht - es wird weder eine neue Datei
erstellt, noch wird die Fehlermeldung mit printf angezeigt! Also scheint
die If-Bedingung immer Null zu sein...
Aber wenn fopen keine Datei findet, gibt es den Null-Zeiger zurück,
somit müsste doch die If-Bedingung erfüllt sein?
Und wenn ich keinen weiteren Dateipfad angebe, bezieht es sich immer auf
das Verzeichnis, in dem auch die ausfühbare Datei gestartet wird?
Hm, mir ist klar, dass das hier vermutlich nur Orakeln wird, aber ich
verzweifel grade, da ich einen vermutlich recht dämlichen Fehler nicht
finden kann. Gibt es irgendeinen Tipp den ihr mir zur Lösung des
Problems geben könnt?
Viele Grüße
EGSler
Vereinfache Deine Abfrage und entferne den Test, ob das erste Zeichen in
der Datei ein 'Z' ist. Das ist für Dein grundlegendes Problem völlig
irrelevant.
Dann lass' Dein Programm im Debugger laufen und sieh Dir an, welchen
Wert fopen zurückgibt.
EGSler schrieb:> Aber das Programm soll beim Start überprüfen, ob ein Logfile existiert> und falls das nicht nicht der Fall ist soll dieses erstellt werden.> Das hat so auch schon geklappt, das Programm lief letztes Jahr> einwandfrei.
Warum nimmst du bei open nicht den Appendmode:
"a"
Opens for writing at the end of the file (appending) without removing
the EOF marker before writing new data to the file; creates the file
first if it doesn't exist.
Der erzeugt dir ein neues File wenn kein da ist ansonsten schreibt er
hinten dran weiter.
EGSler schrieb:> Ziel = fopen ("Logfile.txt", "r");
Bist du sicher dass dein Programm in genau dem Verzeichnis ausgeführt
wird in dem die Datei steht?
Ein kompletter oder relativer Pfad wäre vieleicht besser.
Und wie Rufus schon gesagt hat. Wenn du zwei Bedingungen in einem if
hast dann fällt es schwer herauszufinden welche zutrifft.
Das kann man aber in 2 Minuten ändern indem man (testweise) ein if mit
genau einer Bedingung einbaut, und wenn man kein Debugger hat kann man
sich das was man wissen will durch ein printf ausgeben lassen.
Udo Schmitt schrieb:> Bist du sicher dass dein Programm in genau dem Verzeichnis ausgeführt> wird in dem die Datei steht?> Ein kompletter oder relativer Pfad wäre vieleicht besser.
Ha! Ich hab die Datei gefunden! Sie befindet sich nicht in dem
Ausführungsverzeichnis von meinem Programm
(home/pi/Documents/Geany/GTK), sondern direkt in home/pi!
Wie kommt denn das zustande? Ich bin mir sicher, dass die Datei letztens
noch im Ausführungsverzeichnis erstellt wurde... oO
Naja, dann kommt also einfach eine gesamte Pfadangabe in den Befehl.
Später soll das Logfile sowieso automatisch auf einen USB-Stick
gespeichert werden ;)
EGSler schrieb:> Ha! Ich hab die Datei gefunden! Sie befindet sich nicht in dem> Ausführungsverzeichnis von meinem Programm
woher kennst du das Ausführungsverzeichnis von deinem Programm?
Es ist nicht das Verzeichnis wo das Programm liegt!
Da hast du auch wieder recht. Ich bezog mich aber auf den Speicherort
von meinem Programm. Denn genau in diesem lag noch das Logfile von
letzem Jahr (das ich nicht dorthin verschoben habe, sondern das
automatisch dort erstellt wurde).
Naja, wie auch immer. Vielleicht kann das jemand erklären, aber mit dem
kompletten Pfad läufts sauber durch ;)
Sollte ich mir eventuell eh angewöhnen, den Pfad komplett anzugeben...
Peter II schrieb:> Es ist nicht das Verzeichnis wo das Programm liegt!
Das Ausführungsverzeichnis muß nur im Suchpfad liegen.
Das ist aber selten das aktuelle Verzeichnis.
EGSler schrieb:> Ha! Ich hab die Datei gefunden! Sie befindet sich nicht in dem> Ausführungsverzeichnis von meinem Programm> (home/pi/Documents/Geany/GTK), sondern direkt in home/pi!> Wie kommt denn das zustande? Ich bin mir sicher, dass die Datei letztens> noch im Ausführungsverzeichnis erstellt wurde... oO
vielleicht hast du das Programm von deinem Home verzeichnis aus
aufgerufen.
~$ Documents/Geany/GTK/tool
so, dass es die log datei im working directory abgelegt hat.
Wenn du willst, dass die Datei immer im Programmverzeichnis erzeugt
wird, muss du dir den Pfad aus argv[0] zusammenbauen.
Peter Dannegger schrieb:> Peter II schrieb:>> Es ist nicht das Verzeichnis wo das Programm liegt!>> Das Ausführungsverzeichnis muß nur im Suchpfad liegen.
wieso das denn?
Man kann Programm auch mit kompletten Pfad starten
cd /tmp
/home/ich/foo
dann ist das Ausführungsverzeichnis /tmp
Absolute Pfade führen immer zu Ärger, sollte man vermeiden.
Ich hab schon ewig nicht programmiert. Unter DOS gab es eine Funktion,
mit der man einen Zeiger auf die Kommandozeile der Shell (command.com)
erhalten konnte. Da stand dann der expandierte Aufruf mit Pfad und
Argumenten drin.
Udo Schmitt schrieb:> Und wie Rufus schon gesagt hat. Wenn du zwei Bedingungen in einem if> hast dann fällt es schwer herauszufinden welche zutrifft.
Vor allen Dingen macht man dann hier nicht den Fehler, die Datei 2 mal
zu öffnen.
1
FILE*Ziel;
2
Ziel=fopen("Logfile.txt","r");
3
4
if(Ziel==NULL||fgetc(Ziel)!='Z')
5
{
6
printf("Keine Datei gefunden");
7
Ziel=fopen("Logfile.txt","w");
konnte die Datei geöffnet werden UND ist das erste Zeichen kein 'Z',
dann wird Ziel nicht mittels eines fclose geschlossen sondern ein 2-ter
fopen auf die Datei gemacht. Gratulation. Du hast somit den FILE Handle
auf die mittels "r" geöffnete Datei verloren und kannst die nicht mehr
schliessen.
Und wenn ich dir noch einen Rat geben darf:
Eine Fehlermeldung "Keine Datei gefunde" ist so sinnlos wie ein Kropf.
In eine derartige Fehlermeldung gehört IMMER der Dateiname mit rein.
Niemand hat etwas davon, wenn man ein Programm startet und das Programm
meldet "File not found". Das musste auch Microsoft lernen, die Millionen
von Programmierern mit ihrer Meldung "A DLL was not found" in den
Wahnsinn getrieben haben. Ist ja gut, dass irgendeine DLL nicht gefunden
wurde - aber zum Teufel noch mal WELCHE!
Abgesehen davon, dass das in diesem Fall hier egal ist (da kein Zugriff
auf andere Dateien erfolgt, und es ja kein wirklicher Fehlerfall ist -
die Meldung diente mehr dem Debugging während des Programmierend) ist
das natürlich ein guter Hinweis, die Fehlermeldung ist wirklich
nichtssagend.
Dein erste Hinweis erscheint mir umso wichtiger - das werde ich nochmal
überdenken!
EGSler schrieb:> Abgesehen davon, dass das in diesem Fall hier egal ist (da kein Zugriff> auf andere Dateien erfolgt, und es ja kein wirklicher Fehlerfall ist -> die Meldung diente mehr dem Debugging während des Programmierend)
:-)
Auch beim Debuggen kann es recht hilfreich sein, wenn man zb sieht unter
welchem Pfad die Datei gesucht wurde bzw. ob im Filenamen überhaupt
einer drinnen ist.
Wie du ja am eigenen Leib erfahren hast :-)