eigenes fprintf



  • hallo Leute!

    Ich möchte einer Methode die selben Werte übergeben wie bei printf.

    So ähnlich:

    void Write(const char *txt,...)
    {
       //FILE *file ist eine Member-Variable
       fprintf(file,txt,....);
    }
    

    Der Aufruf soll so erfolgen:

    Klasse x;
    x.Write("Spalte %d - Zeile %d",spalte[i],zeile[i]); //wie bei printf, fprintf,...
    

    Ich hoffe ihr habt mein Problem verstanden. Ich hab keine Ahnung wie man sowas macht. 😕

    Weiß nicht mal nach was ich da suchen könnte um hilfe zu erhalten (zB. in Google) 😞 .

    Währe Toll wenn jehmand einen Link oder einen Codeausschnitt hätte.

    Danke im voraus, MFG, Sigi



  • Hallo,
    wir haben eine gute Suchfunktion:
    http://www.c-plusplus.net/forum/viewtopic.php?t=48210
    http://www.c-plusplus.net/forum/viewtopic.php?t=25919
    etc.
    (Such mal nach va_list, va_arg z.b.)
    Aber warum verwendest du nicht das IMHO schönere und modernere und einfachere C++ Filehandling?



  • #include <stdio.h> 
    #include <stdarg.h> 
    #include <varargs.h>
    
    int Print2EndLB(char *acFmt,...)
    {
      va_list ap;
      char UserText[1024 +1];// das +1 ist eine Marotte   
                             // von mir um den üblichen Fehler zu vermeiden das für  
                            // die schließende Null kein Platz mehr da ist.  
      va_start(ap,acFmt);
      vsprintf(UserText,acFmt,ap);
      va_end(ap);
    
    .....
    printf(UserText);  // Hier machst du deine gewünschte Ausgabe file,....
    .....
    
      return PASS;
    }
    


  • Das hier ist doch das C++-Forum und da du sowieso schon Klassen verwendest, mach es doch gleich so 😉

    #include <fstream>;
    class x
    {
        std::ofstream file;
     public:
        template<typename T>
        x& operator<<(const T& Data)
        {
            file << Data;
            return *this;
        }
    };
    

    Dann ist die Ausgabe gegessen und du kannst dir bei Bedarf noch Manipulatoren einbauen oder sogar das Template für eigene Datentypen spezialisieren.

    x bla;
    
    x << "hallo" << " welt " << 5 << 3.0f;
    

    Typen- und idiotensicher 😉

    mann sollte bloß vorher zum Beipsiel im Konstruktor das File öffnen.



  • Super!!! Danke!!!

    hab grad das Teil von PAD eingebaut. Das funzt! Hab aber die varargs.h nicht included (gab nur Fehler)

    Werd sofort die Klasse von Theston ausprobieren (daran hab´ ich grad nicht gedacht 😉 ). Sieht vielversprechend aus.

    MFG, Sigi



  • @Theston Waren es nicht gerade die Manipulatoren die ihn interessierten ?

    Ich mach doch keine Funktion mit variablen Argumenten alla printf, wenn ich nicht die Daten in speziellen Formaten ausgeben will.

    Wie sähen diese Manipulatoren aus?



  • Manipulatoren, die man auch mit dem mit dem Klassenoperator anwenden kann:
    http://home.arcor.de/cpp_kurs/cpp/le01/k1_04_06.htm

    Die hier muss man direkt auf die File-Variable anwenden:
    http://home.arcor.de/cpp_kurs/cpp/le01/k1_04_d5.htm

    Ich denke, das reicht fürs meiste 🙂



  • @Theston wenn du die allgemeinen Manipulatoren meintest, dann muß ich sagen ist mir eine Ausgabe alla printf deutlich lieber. Die Lesbarkeit in diesem Statement ist für mich deutlicher als in der
    C++ Schreibweise.

    Als sinnvoller Kompromiss wäre hier eine Formatierung alla sprintf und die Ausgabe mit den C++ methoden. Das ist a nicht verboten und hier wahrscheinlich sinnvoll.

    Schade ist allerdings das das sprintf(...) prinzipiell relativ Fehler/Absturzträchtig bei Fehlern ist.


Anmelden zum Antworten