Probleme beim erstellen einer Datei



  • 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?


  • Mod

    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.


  • Mod

    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 🙂


  • Mod

    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 😉


Anmelden zum Antworten