Erzeugen einer Datei, falls diese nicht existiert

Gast #4086011
Lesenswert?

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:
1
// Erzeugen der Logfile.txt
2
FILE *Ziel;
3
Ziel = fopen ("Logfile.txt", "r");
4
      
5
if (Ziel == NULL || fgetc(Ziel) != 'Z')  
6
{  
7
  printf("Keine Datei gefunden");
8
  Ziel = fopen ("Logfile.txt", "w");
9
  fprintf(Ziel, "Zeit\tAD1_Ch1\tAD1_Ch2\tAD1_Ch3\tAD1_Ch4\tAD1_Ch5\tAD1_Ch6\tAD1_Ch7\tAD1_Ch8\tAD2_Ch1\tAD2_Ch2\tAD2_Ch3\tAD2_Ch4\tAD2_Ch5\tAD2_Ch6\tAD2_Ch7\tAD2_Ch8\n");  
10
}
11
fclose(Ziel);

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
#4086047
Lesenswert?

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.
#4086049
Lesenswert?

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.
Gast #4086070
Lesenswert?

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 ;)
Gast #4086085
Lesenswert?

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...
#4086094
Lesenswert?

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.
#4086103
Lesenswert?

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.
#4086156
Lesenswert?

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!
Gast #4086177
Lesenswert?

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!
#4086202
Lesenswert?

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 :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren