Funktion ladet die Datei nur inerhalb der Funktion ?



  • Hallo,
    erstmal der Quellcode zu meiner Frage :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    enum { SUCCESS=0, ERROR};
    
    int load(FILE *datei,char *file_name,size_t *file_size){
      datei=fopen(file_name,"r");
      if(datei == NULL)
        return ERROR;
    
      fseek(datei,0,SEEK_END);
        *file_size=ftell(datei);
      fseek(datei,0,SEEK_SET); 
      return SUCCESS;
    }
    
    void strfit(char *string){
      int i=1;
      while(string[i]!='\n' && string[i]!='\0')
        i++;  
      if(string[i]=='\n')
        string[i]='\0';  
    } 
    
    int main(int argc, char *argv[])
    {
      FILE *datei=NULL;
      size_t file_size=0;
      char puffer[80]={0}, *file_name;
    
      strcpy(puffer,"test.txt");  /* entfernen */
      while(load(datei,puffer,&file_size)){
        printf("-!- Datei konnte nicht gefunden werden.\n");
        printf("\nDatei:");
        fgets(puffer,80,stdin);
        strfit(puffer);    
      }
      /* puffer in file_name kopieren */
      file_name=malloc(sizeof(char)*strlen(puffer)+1); 
      strcpy(file_name,puffer);
    
      printf("-\001-Datei gefunden:%s (%d %sByte)\n",file_name,(file_size>1024)? file_size/1024:file_size,(file_size>1024)?"K":"");
    
      system("PAUSE");	
      return 0;
    }
    

    Nun hab ich folgendes Problem, außerhalb der Funktion load, kann ich die Datei nicht ansprechen ( zum Beispiel ein Zeichen lesen mit fgetch() );
    Als ich den FileZeiger in der main Funktion untersuchte, stellt ich fest, dass die Adresse auf die er zeigt unverändert nach dem Funktionsaufruf von load bleibt? 😕

    EDIT: Ich bekomme keine Compiler Fehler.

    Was mache ich falsch ?

    MfG
    sam_sam



  • Der Parameter 'datei' ist eine lokale Kopie der Variablen aus dem Hauptprogramm - das heißt, wenn du den änderst, hat das keine Auswirkungen nach außen. Um die Variable des Hauptprogramms ändern zu können, mußt du einen Zeiger auf sie übergeben:

    int load(FILE** datei,...)
    {
      *datei=fopen(...);
      ...
    }
    
    int main()
    {
      FILE* datei = NULL;
      ...
      if(load(&datei,...))
        ...
    }
    


  • vielen, vielen Dank CStoll!

    der Zeiger in der Funktion load sieht also so aus:

    **datei:
    eigene Adresse -> Adresse von datei in main -> Wert von *datei

    ist das so richtig ?


Anmelden zum Antworten