Probleme beim erstellen einer Datei
-
Reine Existenz kannst du mit fopen im Lesemodus prüfen (mal angenommen, die Datei hat keine verrückten Rechte, die Schreiben erlauben, aber Lesen verbieten). Du kannst damit aber nicht Prüfen, ob du auch reinschreiben darfst. Dazu müsstest du logischerweise versuchen, sie auch schreibend zu öffnen. Also erst Lesen Existenz prüfen, dann Schreibend Schreibrecht prüfen. Im append-Modus wird die Datei dabei noch nicht einmal verändert (außer eventuelle Timestamps).
Da du hier einen Fehler bei Existenz ausgeben willst, reicht es dir aber, sie einfach einmal Lesend zu öffnen. Bei Nichtexistenz erstellst du sie dann neu.
Versuch am besten auch, Dateien nicht mehrmals gleichzeitig zu öffnen. Das könnte nämlich fehlschlagen.
Rechte kennt Standard-C überhaupt nicht, das ist reine Betriebssystemsache und muss daher mit entsprechenden Funktionen behandelt werden. Jedenfalls wäre es ein Fehler, erst irgendwelche Rechte zu prüfen und sich dann im späteren Programmverlauf auf diese Rechte zu verlassen, denn sie könnten sich durch äußere Faktoren verändern. Ein Datei ist genau dann erfolgreich geöffnet worden, wenn fopen das sagt. Nicht wenn du dir denkst, dass du sie aufgrund früherer Informationen erfolgreich öffnen solltest.
-
Vielen Dank, hast mir sehr geholfen. Das mit dem Prüfen der Datei funktioniert jetzt
-
Ich hätte da doch noch eine weitere Frage zum selben Thema. Ich lese über die Kommandozeile einen Pfad als Zeiger auf char ein und wenn ich dann während der Ausführung nur einen Dateinamen ohne Pfad angebe erstellt mir die Funktion die gewünschte Datei im selben Verzeichnis, was auch korrekt ist. Bei angabe eines Pfads zb /home/.../test funktioniert das dann aber nicht mehr, also fopen liefert mir einen Nullzeiger. Der ganze Pfad befindet sich wie gesagt in einer Variablen datei und dann rufe ich halt fopen(datei,..) auf. Muss ich die Zeichenkette da vorher vielleicht irgendwie zerteilen oder so?
-
filzstift schrieb:
Muss ich die Zeichenkette da vorher vielleicht irgendwie zerteilen oder so?
Nein, das darfst du sogar ausdrücklich nicht machen. Deiner prosaischen Beschreibung nach müsste es funktionieren. Es wird wohl ein Fehler in der technischen Umsetzung sein.
-
Ok, also gekürzt sieht das ganze so aus:
char *name; //wird als Parameter der Funktion übergeben strcat(name,".c"); FILE *datei = fopen(name,"w");
Der Parameter bekommt das Argument aus der Kommandozeile übergeben. Wenn ich mir die Zeichenkette ausgeben lasse ist die korrekt, z.b. "/home/test.c". Aber das kann wohl nicht geöffnet werden. Wenn ich hingegen nur "test.c" eingebe klappt es..
-
Du solltest am String aus der Kommandozeile nichts ändern, da er nicht "dein Eigentum" ist und wohl mit gerade ausreichend großen Speicher reserviert wurde, sodass ein Anfügen weiteren Inhalts sogar zu einem Fehler führen könnte.
Stattdessen solltest du eine Kopie mit größeren Speicher erstellen und dort deine Änderung vornehmen.// Includes #include <stdio.h> // FILE, fopen, fclose, printf #include <stdlib.h> // malloc #include <string.h> // strcpy, strcat // Program entry int main(int argc, char** argv){ // Declarations char *filename; FILE *file; // Any program parameter? if(argc > 1){ // Copy first program parameter to new memory filename = (char*)malloc(strlen(argv[1]) + 3); // Reserve enough memory for old content + 2 characters strcpy(filename, argv[1]); // Append text strcat(filename, ".c"); // Open file in read mode file = fopen(filename, "r"); // Could open file? if(file){ // Message on successfull file opening printf("Could open file \"%s\"!", filename); // Close file fclose(file); } // Free memory free(filename); } // Program ends with positive error status return 0; }
-
Danke, das hilft mir schonmal ein wenig weiter. Das funktioniert jetzt aber nur für Dateien die entweder im selben Verzeichnis wie die C-Datei liegen oder in einem Ordner in diesem Verzeichnis, d.h. ich kann keinen absoluten Pfad wie "/home/../abc/test.c" angeben. Warum ist das so? Zudem krieg ich auch noch einen Nullzeiger zurück wenn ich als erstes Zeichen ein "/" schreibe, also "abc/test.c" funktioniert aber "/abc/test.c" nicht.
-
filzstift schrieb:
Danke, das hilft mir schonmal ein wenig weiter. Das funktioniert jetzt aber nur für Dateien die entweder im selben Verzeichnis wie die C-Datei liegen oder in einem Ordner in diesem Verzeichnis, d.h. ich kann keinen absoluten Pfad wie "/home/../abc/test.c" angeben. Warum ist das so? Zudem krieg ich auch noch einen Nullzeiger zurück wenn ich als erstes Zeichen ein "/" schreibe, also "abc/test.c" funktioniert aber "/abc/test.c" nicht.
Das sollte nicht so sein. Lass dir mal zum Testen den fertigen Dateinamen im Programm angeben. Sind im Pfad zufällig Whitespace oder sonstige Sonderzeichen? Hast du die beim Aufruf auch korrekt angegeben? Hast du überhaupt Schreibrechte in dem Pfad?
-
Ahh ich hatte jetzt bloß noch einen Fehler in der Pfadangabe, hab mich einfach im Verzeichnis vertan und das existierte dann natürlich nicht
Danke nochmal, funktioniert jetzt wie es soll
-
filzstift schrieb:
Ahh ich hatte jetzt bloß noch einen Fehler in der Pfadangabe, hab mich einfach im Verzeichnis vertan und das existierte dann natürlich nicht
Danke nochmal, funktioniert jetzt wie es soll
Off Topic: Die Funktion der Tabulatortaste in Konsolen kennst du?
-
Ja klar, sollte ich nur vielleicht auch mal anwenden