String in seperate Datei ausgeben.... klappt nicht.?



  • Hallo!

    Das Programm unten soll ein eingegebenes Wort in eine Datei speichern.

    #include <stdio.h>
    
     int main(void)
    
       {
               FILE *datout;
               char buffer[100], dname[100], farbe[100];
    
              printf("in Welche Datei soll gespeichert werden?\n");
    
              fgets(buffer,100,stdin);                //eingabe Dateiname
              sscanf(buffer,"%s",&dname);
    
              datout=fopen(dname,"w+");               //oeffne Datei, gegebenfalls erstellen
    
              fprintf("Gib Farbe ein!\n");
              fgets(buffer,100,stdin);                //Eingabe Farbe
              sscanf(buffer,"%s",&farbe);
    
              fprintf(datout,"%s",farbe);             //Ausgabe Farbe in die Datei
    
              fclose(datout);                         //Schliesse Datei
    
              printf("Fertig\n");
    
              return 0;
      }
    

    Fehlermeldung:
    test.c:17:2: Warnung: Übergabe des Arguments 1 von »fprintf« von inkompatiblem Zeigertyp [standardmäßig aktiviert]
    /usr/include/stdio.h:353:12: Anmerkung: »struct FILE * __restrict__« erwartet,aber Argument hat Typ »char *«
    test.c:17:2: Fehler: Zu wenige Argumente für Funktion »fprintf«

    Wo liegt das Problem? Ich verstehe die Fehlermeldung nicht wirklich..

    Gruß ser_u



  • Der fprintf Aufruf in Zeile 17, wohin soll der deiner Meinung nach schreiben?



  • ah verdammt das muss printf sein.
    ich änder das mal schnell



  • ser_u schrieb:

    Fehlermeldung:
    test.c:17:2: Warnung: Übergabe des Arguments 1 von »fprintf« von inkompatiblem Zeigertyp [standardmäßig aktiviert]
    /usr/include/stdio.h:353:12: Anmerkung: »struct FILE * __restrict__« erwartet,aber Argument hat Typ »char *«
    test.c:17:2: Fehler: Zu wenige Argumente für Funktion »fprintf«

    Wo liegt das Problem? Ich verstehe die Fehlermeldung nicht wirklich.

    Hast Du sie denn mal gelesen und versucht sie zu verstehen?
    Z.B.:

    Warnung: Übergabe des Arguments 1 von »fprintf« von inkompatiblem Zeigertyp
    Anmerkung: »struct FILE * __restrict__« erwartet,aber Argument hat Typ »char *«

    Was könnte das bedeuten?

    Oder das:

    Zu wenige Argumente für Funktion »fprintf«

    Na?

    Es hilft auch, sich die Dokumentation von fprintf in diesem Zusammenhang anzusehen.



  • oh man, danke danke danke für den Hinweis. ne halbe stunde vergeudet wegen nem blöden "f" zu viel 😃

    gruß



  • zeile 17 soll einfach in die Konsole ausgegeben werden, also nur printf("...");

    jetzt klappt alles super!

    gruß



  • In Zeile 13 und 19 sind aber noch Fehler.



  • Hey DirkB, hab leider deine Anmerkung nicht gesehen bis jetzt.

    In wie weit sind die beiden Zeilen falsch?



  • Da ist jeweils das & zuviel.



  • Heißen die Zeilen nicht in Worten übersetzt:

    "lese aus buffer einen String aus und weise diesen String dname bzw farbe zu" ?

    Und muss man bei einer Zuweisung nicht ein & benutzen?



  • ser_u schrieb:

    Heißen die Zeilen nicht in Worten übersetzt:

    "lese aus buffer einen String aus und weise diesen String dname bzw farbe zu" ?

    Nein, die Anweisung sscanf(buffer,"%s",&dname); heißt "Rufe die Funktion sscanf mit den Parametern buffer, "%s" und der Adresse von dname auf", nichts weiter. Dann guckst du in die Dokumentation von sscanf, und da steht, welche Parameter welchen Typs erwartet werden und was jeweils passiert.

    Und muss man bei einer Zuweisung nicht ein & benutzen?

    Nein, eine Zuweisung geschieht mit einem =. Hier ist keine Zuweisung zu sehen. Deine sscanf-Aufrufe funktionieren, weil die Adresse eines Arrays lediglich den falschen Typ hat, aber vom Wert her gleich der Adresse des ersten Elementes ist.



  • Das ist interessant! Man hat mir im C-Kurs an der Uni beigebracht, das & unbedingt dorthinzuschreiben.

    Ich werd mal nochmal in die Dokumentation schauen und evtl. meinen Tutor fragen.



  • Ganz sicher nicht unbedingt. An die Stelle muss ein Zeiger, der auf einen Speicherbereich zeigt, in den der einzulesende Wert geschrieben werden kann.
    Da Du in diesem Fall in ein Array schreiben lassen willst, gehört dort der Arrayname, der einen Zeiger auf das erste Arrayelement repräsentiert, hin.

    Anders wäre es, wenn Du zB einen int - Wert einlesen und in eine int - Variable schreiben lassen wolltest. Dann wäre bei zB.

    int eingabeWert;
    

    die Adresse mit

    &eingabeWert
    

    ermittelbar und so auch dort zu notieren.



  • Da dname identisch zu &dname[0] ist, könntest du auch dies so schreiben, aber ersteres ist eben kürzer zu schreiben (und zu lesen, d.h. zu verstehen).



  • Okay, hab nochmal in meinen Unterlagen geblättert, und uns wurde es an der Uni selbstverständlich richtig beigebracht.

    Ich habe es nur ständig falsch ( also mit & bei Arrays) angewendet, es wurde mir aber merkwürdiger Weise nie als Fehler angestrichen.

    Danke also für eure Anmerkungen!


Anmelden zum Antworten