Dateizeiger an eine Funktion übergeben



  • Guten Abend

    Wie schon im Titel beschrieben möchte ich einen Dateizeiger an eine Funktion übergeben. In dieser Funktion will ich dann damit einen Datei öffnen. Der Code sieht so aus

    #include <stdlib.h>
    #include <stdio.h>
    
    void openFile(FILE *dateizeiger);
    
    int main(void)
    {
    	FILE *datei;
    	char text[50];
    
    	openFile(datei);
    
        while(getchar()!=48)    //Solange Zeilen aus der Datei ausgeben bis 0 eingegeben wird
        {
            fgets(text, 50, datei);
            printf("%s", text);
        };
    
    	fclose(datei);  //Datei schliessen
    
    	return EXIT_SUCCESS;
    };
    
    void openFile(FILE *dateizeiger)
    {
        dateizeiger=fopen("test.txt", "r"); //Testdatei mit dem übergebenen Dateizeiger öffnen
    };
    

    Ich weiss, das Programm ist noch für nichts zu gebrauchen, aber ich möchte später so ein Programm erstellen, mit dem in Sachen in verschiedene Dateien schreiben bzw. daraus lesen kann und ich dachte eine eigene Funktion um eine beliebige Datei zu öffnen wäre dabei von vorteil.

    Das Problem ist das Programm stürzt jedes mal beim ausführen ab*(exe funktioniert nicht mehr blablabla...)*, obwohl der compiler ohne Fehlermeldung kompiliert.

    Weiss jemand was der Grund ist?

    grüsse


  • Mod

    Der Grund, warum das nicht funktioniert ist, dass du in der Funktion eine lokale Kopie deines Zeigers änderst. Wenn die Funktion verlassen wird, hat der Zeiger in main immer noch den gleichen (undefinierten) Wert und irgendwo im Datenirvana lebt ein Handle einer geöffneten Datei, die nun nicht mehr geschlossen werden kann. Es ist zwar richtig, dass man eine Variable in einer Funktion ändern kann, indem man einen Zeiger auf diese Variable übergibt. Ist die Variable wie hier jedoch selber ein Zeiger, dann muss man natürlich einen Zeiger auf diesen Zeiger benutzen.

    Die Designidee ist äußerst zweifelhaft. Normalerweise gibt man nichts aus einer Funktion heraus, was dann der Nutzer mit anderen Mitteln wieder abräumen muss. Du solltest daher zu deiner Öffnefunktion auch eine passende Schließfunktion bereitstellen. Du merkst vielleicht worauf das hinausläuft: Du programmierst dann nämlich genau das nach, was die Standardbibliothek derzeit schon macht:

    ich dachte eine eigene Funktion um eine beliebige Datei zu öffnen wäre dabei von vorteil.

    Also eine Funktion wie fopen?



  • Hmm ja ich seh den Fehler.

    Zur Designidee, ich habe mir vorgestellt er wäre übersichtlicher wenn ich eine eigene Funktion hätte, in der dann auch gleich nach dem Dateinamen gefragt wird und sogleich auch geöffnet wird. In einer andere Funktion würde dann in die Datei geschrieben, bzw. daraus gelesen werden. So wären die einzelnen Teilaufgaben übersichtlicher gegliedert. Aber ich glaube ich muss mir das ganze nochmal anschauen :).
    Danke für die schnelle Antwort



  • Wie bekommst du denn den Zeiger von fopen zurück?
    (Wie sieht der Prototyp für fopen aus?)

    Wäre das nicht auch für deine Funktion praktikabel?


Anmelden zum Antworten