suche sprintf ersatz



  • Du kannst dir ja mal die stringstreams ansehen - vielleicht kriegst du damit das hin, was du benötigst:

    stringstream data;
    data<<setw(4)<<param1<<"  "<<setiosflags(ios::left)<<setw(40)<<setprecision(40)<<param2;
    ...
    cout<<data.str();
    


  • Wie wäre es mit boost::format?



  • CStoll (off) schrieb:

    Du kannst dir ja mal die stringstreams ansehen - vielleicht kriegst du damit das hin, was du benötigst:

    ja werd ich mir anschauen, perfekt wäre es, wenn ich vorher festlegen könnte, in welchem format die gewünschten eingegebenen parameter haben

    so etwa:

    stringstream data;
    data << formatierungsangabenParam1 << formatierungsangabenParam2 << formatierungsangabenParam3;
    data << param1 << param2 << param3;
    

    so würde man bei langen/vielen umwandlungen den überblick nicht verlieren.

    any schrieb:

    Wie wäre es mit boost::format?

    kann/darf ich leider nicht verwenden 😞



  • kJunkie schrieb:

    stringstream data;
    data << formatierungsangabenParam1 << formatierungsangabenParam2 << formatierungsangabenParam3;
    data << param1 << param2 << param3;
    

    so würde man bei langen/vielen umwandlungen den überblick nicht verlieren.

    Du könntest dir ja setw(), setiosflags(),... zu einer Klasse zusammenfassen, die du jeweils vor dem jeweiligen Ausgabewert an den Stream schickst:

    stream_format format1(ios::left,4,0),format2(ios::right,40,40);
    data<<format1<<param1;
    data<<format2<<param2;
    ...
    

    (so finde ich das zumindest übersichtlicher als deine Variante.

    any schrieb:

    Wie wäre es mit boost::format?

    kann/darf ich leider nicht verwenden 😞

    Randfrage: Wieso nicht?



  • CStoll schrieb:

    Du könntest dir ja setw(), setiosflags(),... zu einer Klasse zusammenfassen, die du jeweils vor dem jeweiligen Ausgabewert an den Stream schickst:

    hmm ja stimmt das ist eine sehr gute idee! danke!

    CStoll schrieb:

    ]so finde ich das zumindest übersichtlicher als deine Variante.

    ja das ist dann schon fast eine geschmackssache 😃 bzw. meine variante wäre dann was für extrem sprintf geschädigte was gewesen 🙄

    Randfrage: Wieso nicht?
    

    das hängt mit unserer speziell abgeänderten lib zusammen. man muss doch bei der boost ja auch eine lib zusätzlich einbinden, oder?



  • kJunkie schrieb:

    CStoll schrieb:

    ]so finde ich das zumindest übersichtlicher als deine Variante.

    ja das ist dann schon fast eine geschmackssache 😃 bzw. meine variante wäre dann was für extrem sprintf geschädigte was gewesen 🙄

    Ja, das kenne ich - ich muß auch immer zwischen dem Syntax für TRACE() und der iostream-Ausgabe umdenken 😃



  • CStoll (off) schrieb:

    kJunkie schrieb:

    CStoll schrieb:

    ]so finde ich das zumindest übersichtlicher als deine Variante.

    ja das ist dann schon fast eine geschmackssache 😃 bzw. meine variante wäre dann was für extrem sprintf geschädigte was gewesen 🙄

    Ja, das kenne ich - ich muß auch immer zwischen dem Syntax für TRACE() und der iostream-Ausgabe umdenken 😃

    wobei mir jetzt eine steigerung eingefallen ist für die ganze sache, kann man so eine art zellen machen, wo auch ein zeilenumbruch autoamtisch gemacht wird

    1    ich bin ein schmaler        300,--
         text mit automatischen
         zeilenumbruch
    
    2    soetwas wäre echt eine      300,--
         feine sache
    

    das wird wohl den rahmen von den standard geschichten sprengen bzw. ich finde halt nichts für so eine verwendung 🙄



  • Also rein mit Standard-Mitteln wirst du das ziemlich sicher nicht hinbekommen - da die iostreams zeichenweise schreiben bzw. lesen. Aber du kannst dir sicher in der Vorverarbeitung deine Strings entsprechend zerlegen und umordnen.

    struct line
    {
      int num;
      string desc;
      int price;
    }
    
    ostream& operator<<(ostream& sout,const line& data)
    {
      vector<string> desc_split;
      for(int i=0;i<data.desc.length();i+=40)
        desc_split.push_back(data.desc.substr(i,i+40);
      sout<<setw(5)<<data.num<<setw(40)<<desc_split[0]<<setw(5)<<data.price<<",--\n";
      for(int i=1;i<desc_split.size();++i)
      sout<<"     "<<setw(40)<<desc_split[i]<<"\n";
      return sout;
    }
    

    (nur mal ein Ansatz - das Aufsplitten der Zeile kann man sicher eleganter lösen und die Spaltenbreiten sollten letztendlich nicht festverdrahtet werden)



  • danke für den vorschlag! dieser vorschlag gefällt mir sehr gut 👍
    danke für deine tolle unterstützung!



  • entweder bin ich zu dumm oder mittels der width methode wird die eingabe nicht auf die gewünschte zeichenanzahl beschnitten?!
    ähnliches problem schon mal wer gehabt??



  • kJunkie schrieb:

    entweder bin ich zu dumm oder mittels der width methode wird die eingabe nicht auf die gewünschte zeichenanzahl beschnitten?!

    Das liegt daran, dass width die minimale, nicht die maximale Feldbreite fest legt.



  • width() wirkt sich immer nur auf die unmittelbar darauffolgende stringausgabe aus. du mußt also vor jeden string ein width() stellen.

    klingt umständlich, ist aber eigentlich ganz praktisch.

    width() kürzt den string nicht. wilst du eine maximallänge angeben, dann mußt du zusätzlich noch cout.precision(max_laenge) verwenden.



  • danke für die hilfestellung bzgl. width!

    @precision wirkt sicht leider bei cout bzw. stringstreams nur bei zahlen aus 😢



  • kJunkie schrieb:

    @precision wirkt sicht leider bei cout bzw. stringstreams nur bei zahlen aus 😢

    In dem Fall mußt du womöglich für string-Werte improvisieren:

    template<typename T>
    void print_lim(ostream& sout, const T& val, int len=-1)
    {
      if(len<0) len=sout.precision();
      stringstream tmp;
      //Anmerkung: Eventuell sollte tmp noch den übrigen Stream-Status (width, flags,...) von sout übernehmen.
      tmp<<val;
      sout<<tmp.str.substr(0,len);
    }
    


  • das gefällt mir sehr gut! wow danke!


Anmelden zum Antworten