Dateienpointer!!!



  • FILE*fp;
    fp = fopen(...);
    
    funktion(fp);
    
    [...]
    void funktion(FILE*fp)
    {
        [...]
    }
    

    Sollte funktionieren.

    P.S.: Gotos sollte man nicht verwenden vor allem weil man hier ein exit(1) (<stdlib.h>) verwendet. Beim Öffnen der Datei solltest du auf NULL prüfen und nicht auf 0!



  • Danke!!!!

    Wieder mal mein Retter 😃 !

    Find das arg! Weil in meinem Lehrbuch "C Der einfache Einstieg in ANSI C
    mit vielen Beispielen" prüft er immer nach dem Öffnen so ab!

    if(!p_file) 
    {
    printf("Fehler beim Oeffnen der Datei!!!\n");
    }
    

    lg
    Mini



  • Das Problem ist folgendes:

    fopen liefert den File-Pointer zurück und wenn die Datei nicht geöffnet/geschrieben werden konnte wird NULL zurückgeliefert.

    NULL ist ein Makro und kann 0 sein, muss es aber nicht.



  • Verstehe, ist mir jetzt klar!

    Besten Dank!



  • Anzi-C schrieb:

    Beim Öffnen der Datei solltest du auf NULL prüfen und nicht auf 0!

    ob

    if( file == NULL ) {
    
        //...
    }
    

    ,

    if( file == 0 ) {
    
        //...
    }
    

    oder

    if( !file ) {
    
        //...
    }
    

    ist schnurz-piep egal!

    Anzi-C schrieb:

    vor allem weil man hier ein exit(1) (<stdlib.h>) verwendet

    ISO/IEC 9899:1999 schrieb:

    7.20.4.3 The exit function

    Synopsis
    1 #include <stdlib.h>
    void exit( int status );

    [...]

    1. Finally, control is returned to the host environment. If the value of status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned. If the value of status is EXIT_FAILURE, an implementation-defined form of the status unsuccessful termination is returned. Otherwise the status returned is implementation-defined.

    Somit sind für exit( ) entweder

    exit( EXIT_SUCCESS );
    
    // oder
    
    exit( EXIT_FAILURE );
    

    zulässig.

    In den meisten fällen sollte jedoch ein

    return 0;
    

    reichen.

    Greetz, Swordfish



  • Bei exit() ging es mir vorrangig um das goto....



  • So einmal nerve ich noch 😃 !

    Warum kommt es zu einer Fehlermeldung wenn ich das so ausgebe?
    Die strings kann er ausgeben aber bei den double und int Variablen
    will er nicht-der liebe Compiler!

    Nun die Frage ist warum und wie kann ich das ausgeben?

    void ausgabe(struct Sensor *p_sPointer,FILE *p_file)
    {
    printf("\n\nName: %s\n",p_sPointer->name );
    fprintf(p_file,p_sPointer->name );
    
    printf("Type: %d\n",p_sPointer->type );
    fprintf(p_file,p_sPointer->type );
    
    printf("Standard: %lf\n",p_sPointer->standard);
    fprintf(p_file,p_sPointer->standard );
    
    printf("Abweichung: %lf\n",p_sPointer->derivation );
    fprintf(p_file,p_sPointer->derivation );
    
    printf("Qualitaet: %s \n\n\n",p_sPointer->quality );
    fprintf(p_file,p_sPointer->quality );
    
    }
    


  • fprintf erwartet einen FilePointer, einen String und eine variable Anzahl von Argumenten. Wenn du nur einen String ausgeben willst, brauchst du nur den FilePointer und die Adresse des Strings.

    Bei der Ausgabe der ints, doubles, etc. bekommt fprintf() keine Adresse eines Strings übergeben (bei int z.B. "%d", bei double "%lf", usw.) und meckert deshalb.

    Dir fehlt also bei jeder Ausgabe der Format-String, den du bei printf() verwendet hast.



  • du nimmst

    #include <stdio.h>
    
    int main( )
    {
        int foo = 42;
        printf( "%d", &foo );
    }
    

    analog für fprintf. Du musst printf, fprintf und Konsorten die Adresse des auszugebenden Wertes geben.

    @Anzi-C: Wie kommst du auf %lf für double??

    ISO/IEC 9899:1999 schrieb:

    7.19.6.1 The fprintf function

    [...]

    l(ell) Specifies that a following d, i, o, x or X conversion specifier applies to a long int or unsigned long int argument; that a following n conversion specifier applies to a pointer to a long int argument; that a following c conversion specifier applies to a wint_t argument; that a following s conversion specifier applies to a pointer to a wchar_t argument; or has no effect on a following a, A, e, E, f, F, g or G, conversion specifier.

    Greetz, Swordfish



  • Ah, jetzt hab ich es 😃 !Hat lange gebraucht!!!

    printf("Standard: %lf\n",p_sPointer->standard);
    fprintf(p_file,"%lf",p_sPointer->standard );
    

    Danke!!!!!!!!!!!!
    👍 Tolles Forum

    mfg
    Mini



  • @Anzi-C: Wie kommst du auf %lf für double??

    Ganz einfach: Wir haben es so gelernt und unser Lehrer hat mir auch %f in %lf beim letzten Test für die Ausgabe von double ausgebessert.

    EDIT: Bei scanf() benötigt man für double %lf, deshalb verwenden wir es vermutlich auch für printf()...

    @TactX: War ein Fehler meinerseits, ich war davon überzeugt, dass man NULL in dem Fall nicht durch 0 ersetzen kann, habe allerdings jetzt noch einmal nachgelesen bin wieder schlauer geworden! 😉



  • Anzi-C schrieb:

    Beim Öffnen der Datei solltest du auf NULL prüfen und nicht auf 0!

    Warum denn?



  • Weil es sonst zu einem Datenverlust kommen kann!



  • Mini1982 schrieb:

    Weil es sonst zu einem Datenverlust kommen kann!

    Ach!? welche daten denn 😉

    Greetz, Swordfish



  • Swordfish schrieb:

    Mini1982 schrieb:

    Weil es sonst zu einem Datenverlust kommen kann!

    Ach!? welche daten denn 😉

    daten die gespeichert werden sollen. programm kackt ab --> alle daten wech 😉


Anmelden zum Antworten