Handle an Funktion?



  • Tag!
    Ich habe folgende Frage:
    Kann man ein Dateihandle an eine Funktion uebergeben?

    FILE *in;
    in=fopen(in,"r");
    suche(in);

    prototyp der funktion:

    int suche (FILE *in);

    Ich stelle diese Frage,weil das Ergebnis,wenn ich die Funktion ausfuehre ein anderes ist,als wenn ich die routine in die main-Funktion schreibe.



  • Sicher geht das. Ist ja auch bei den vordefinierten Funktionen so, zB:

    void rewind(FILE *fp);
    


  • Das Programm:

    #include <stdio.h>
    
    int main(int agrc,char *argv[])
    {
       char w[1];
       FILE *in;
       in=fopen(argv[1],"r");
       while(strcmp(w,";")!=0)
       {
          fread(w,1,1,in);printf("Funktion\n");
          printf("%d-%c\n",ftell(in),w[0]);
       }
       fclose(in);
    }
    

    Das funktioniert ausgezeichnet.
    schreibe ich aber die while-schleife in eine eigene Funktion:

    int suchen(FILE *in)
    {
       char w[1];
       while(strcmp(w,";")!=0)
       {
          fread(w,1,1,in);printf("Funktion\n");
          printf("%d-%c\n",ftell(in),w[0]);
       }
       fclose(in);
    }
    

    funktioniert das ganze nicht mehr.Ich erhalte keine fehlermeldung aber der vergleich strcmp(w,";") liefert nie 0.Da es sich aber um dasselbe Handle handeln soll,muesste er ein ";" finden.
    Sehr seltsam.Wer kann helfen?
    P.s.:ich kompiliere unter linux mit cc.



  • Schreib statt:

    fread(w,1,1,in);printf("Funktion\n");
    

    mal das hier:

    fread(w,sizeof(char),1,in);printf("Funktion\n");
    


  • sizeof(char) ist immer 1. Garantiert.

    Der Fehler liegt an anderer Stelle. strcmp vergleicht Strings. Ein String ist definiert als eine Folge von chars, die durch ein NUL-char abgeschlossen wird. Wo ist denn bei dir bitte das Endezeichen? Es gibt keins, da dein Array nur für 1 Zeichen Platz hat, und du das immer per fread überschreibst.

    Ums mal mit den Worten des Standards zu sagen: Das Verhalten ist undefiniert.. Das heißt im allgemeinen, dass alles passieren kann, und im besonderen, dass es auch zufällig so klappen kann, wie du dir das vorgestellt hast. Man könnte jetzt mutmaßen, warum es funktioniert hat, als die Schleife in der main stand, aber ich spar mir das.

    Dein Code hat noch eine Reihe weiterer Fehler:

    • w ist beim ersten Prüfen der Bedingung nicht initialisiert
    • suchen ist vom Typ int, aber es wird kein Wert zurückgegeben
    • ftell liefert long, du gibst aber nur mit %d aus

    Verbesserungsvorschlag:

    #include <stdio.h>
    
    void suchen(FILE *in)
    {
       char w = 0;
       while (w != ';')
       {
           w = fgetc(in); puts("Funktion");
           printf("%ld-%c\n", ftell(in), w);
       }
    }
    
    int main(int argc,char *argv[])
    {
       FILE *in = fopen(argv[1],"r");
       if (in) {
          suchen(in);
          fclose(in);
       }
       return 0;
    }
    

    [ Dieser Beitrag wurde am 20.10.2002 um 22:17 Uhr von Bashar editiert. ]


Anmelden zum Antworten