Dateienpointer!!!



  • Hallo!

    Wie übergebe ich den Dateienpointer an eine Function bzw. welcher
    Datentyp ist das überhaupt?

    Ich habe vor die Strukturvariablen meines Strukturarrays mit
    einer Ausgabefunktion auszugeben und da sollte ich eigentlich
    den D-Pointer auch übergeben! Die Funktion dient zum Abspeichern als
    Text-file und zur Ausgabe am Bildschirm!

    Danke!

    mfg
    Raffael



  • 😕 datenpointer??? D pointer??? was fuer strukturen??? 😕



  • void foo(char *); // Zeiger auf char
    void bar(void *); // Zeiger auf void
    // etc.
    

    PS: !!!!! wirkt nicht gerade sonderlich schick.



  • FILE *p_file;
    


  • Hier ist mein gesamtes Programm:

    #include<stdio.h>
    #include<stdlib.h>
    
    struct Sensor
    {
    char name[6];
    int type;
    double standard;
    double derivation;
    char quality[6];
    }Sensor_feld[80];
    
    int eingabe(struct Sensor *p_sPointer,int iAnzahl);
    void ausgabe(struct Sensor *p_sPointer);
    
    void main(void)
    {
    int iAnzahl;
    int iWert;
    struct Sensor *pt;
    FILE *p_file;
    
    p_file = fopen("text.txt","w");
    
    if(!p_file) 
    {
    printf("Fehler beim Oeffnen der Datei!!!\n");
    goto Marke1;
    }
    
    printf("Wieviele Sensoren wollen Sie speichern: \n");
    scanf("%d",&iAnzahl);
    
    iWert=eingabe(Sensor_feld,iAnzahl);
    
    Sensor_feld[iWert].type = -1;
    
    for(pt=Sensor_feld;pt->type !=-1;pt++)
    {
    ausgabe(pt);
    
    }
    
    fclose(p_file);
    Marke1: ;
    }
    
    int eingabe(struct Sensor *p_sPointer,int iAnzahl)
    {
    int index;
    double derivation;
    double a,b,c;
    
    for(index=0;index<iAnzahl;index++)
    {
    printf("Sensordaten eingeben: Abbruch mit *\n");
    
    printf("Namen des Sensors:\n");
    scanf("%s",p_sPointer[index].name);
    
    if (*p_sPointer[index].name =='*') break;
    
    printf("Type: \n");
    scanf("%d",&p_sPointer[index].type );
    
    printf("Standard: \n");
    scanf("%lf",&p_sPointer[index].standard );
    
    printf("Abweichnung: \n");
    scanf("%lf",&derivation);
    p_sPointer[index].derivation = (100*derivation)/p_sPointer[index].standard ;
    
    printf("Qualität:\n");
    scanf("%s",p_sPointer[index].quality );
    
    }
    
    return index;
    }
    
    void ausgabe(struct Sensor *p_sPointer)
    {
    printf("\n\nName: %s\n",p_sPointer->name );
    //fprintf(p_file,p_sPointer->name );
    printf("Type: %d\n",p_sPointer->type );
    printf("Standard: %lf\n",p_sPointer->standard);
    printf("Abweichung: %lf\n",p_sPointer->derivation );
    printf("Qualitaet: %s \n\n\n",p_sPointer->quality );
    
    }
    

    So versuche ich jetzt mit fprintf es in einer Datei zu speichern?
    Muss ich den D-Pointer eigentlich übergeben?



  • Die eigentlich Frage ist welcher Datentyp ist dieser Zeiger???
    Weil wenn ich die Funktion definiere und nicht weiß welcher
    Datentyp das ist kann ich es nicht definieren

    void ausgabe(struct Sensor *p_sPointer, ?????????
    

    );

    mfg
    Mini



  • 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