Forum: PC-Programmierung Erzeugen einer Datei, falls diese nicht existiert


von EGSler (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von EGSler (Gast)


Lesenswert?

Das Vereinfachen der If-Abfrage hat erstmal nicht geändert, ich werde 
mal schauen, ob ich für Geany einen Debugger finde.

von Helmut L. (helmi1)


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.

von Udo S. (urschmitt)


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.

von EGSler (Gast)


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

von Peter II (Gast)


Lesenswert?

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!

von EGSler (Gast)


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...

von Peter D. (peda)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


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.

von Peter II (Gast)


Lesenswert?

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

von Peter D. (peda)


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.

von Peter D. (peda)


Lesenswert?

Peter II schrieb:
> wieso das denn?

OMG.
Natürlich nur bei Aufrufen ohne Pfadangabe.
Ich hatte das als bekannt vorausgesetzt.

von Karl H. (kbuchegg)


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!

: Bearbeitet durch User
von EGSler (Gast)


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!

von Karl H. (kbuchegg)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.