String als Übergabe einer Funktion



  • Hallo, ich habe ein vergleichsweise einfaches Problem, stehe aber irgendwie auf dem Schlauch.

    Ich habe ein Funktion definiert, die Zeilenweise aus einer Datei liest:

    char *lese_datei( FILE *eingabe_datei )
    {
    	char ausgabe_zeile[LEN_ZEILE];
    	int laenge_zeile = LEN_ZEILE -1;
    	char *zeiger = ausgabe_zeile;
    
    	if ( ( fgets( ausgabe_zeile, laenge_zeile, eingabe_datei) ) == NULL )
    	{
    		perror ( "Fehler beim Auslesen der Datei" );
    		exit ( -1 );
    	}
    	return zeiger;
    }
    

    Diese Funktion wird von einer anderen Funktion aufgerufen:

    int scanner( FILE *eingabe_datei )
    {
    	char eingabe_zeile[LEN_ZEILE];
    	char *zeiger = eingabe_zeile;
    	int rueck_gabe = 0;
    
    	zeiger = lese_datei ( eingabe_datei );
    
    	fputs ( eingabe_zeile, stdout );
    	return rueck_gabe;
    }
    

    Nur es kommt nichts an in der aufrufenden Funktion! Kann mir jemand einen schnellen Tip geben?

    Danke und..

    Gruss Christian



  • Das Array ausgabe_zeile ist lokal, existiert also nicht mehr nach Verlassen der Funktion.

    Weiterhin schreibst du ja den Inhalt des Arrays eingabe_zeile raus, das ja nirgendwo gefüllt wird..



  • rocksteady schrieb:

    Das Array ausgabe_zeile ist lokal, existiert also nicht mehr nach Verlassen der Funktion.

    Weiterhin schreibst du ja den Inhalt des Arrays eingabe_zeile raus, das ja nirgendwo gefüllt wird..

    Danke für die schnelle Antwort

    WÜrde es helfen die ganze Funktion 'lese_datei' static zu >machen< bzw nur die Variable zeiger?

    Wenn ich den Zeiger einen static-scope gebe meckert der GCC daß ...

    error: initializer element is not constant

    Ich hatte in erinnerung daß es da eine elegantere Methode gibt wie man das zeilenweise lesen aus einer Datei in eine Funktion kapselt!?

    Gruss Christian



  • columbus schrieb:

    WÜrde es helfen die ganze Funktion 'lese_datei' static zu >machen< bzw nur die Variable zeiger?

    Das Problem ist das Array ausgabe_zeile, das lokal ist und danach nicht mehr existiert, zeiger static zu machen bringt dir daher nichts, du müsstest schon das Array static machen.

    Du könntest andererseits z.B. in der aufrufenden Funktion ein Array anlegen und dessen Adresse an die Funktion lese_datei übergeben (und die Arraygröße):

    int scanner(FILE* eingabe_datei)
    {
    ...
    char zeile[20];
    ...
    lese_datei(zeile, 20, eingabe_datei);
    ...
    fputs(zeile, stdout);
    }
    

    In der Funktion lese_datei nimmst du die Parameter dann einfach her:

    // Code nach K&R
    int lese_datei(char* zeile, int len, FILE* datei)
    {
    if(fgets( zeile, len, datei)==NULL)
     return 0;  // Dateiende
    else
     return strlen(line);  // Länge d. Zeile
    }
    

    Aber mach das Ganze doch einfach so:

    int scanner(...)
    {
    char zeile[ZEILE_LEN];
    ...
    while(fgets(zeile, ZEILE_LEN, eingabe_datei))
          fputs(zeile, stdout);
    ...
    }
    

    Beim Vergleich mit NULL musst du aufpassen weil ein NULL-Zeiger auch beim Dateiende zurückgegeben wird...


Anmelden zum Antworten