Stringformatierung



  • Hallo Leute,

    ich habe folgende kleine Unterroutine ......

    //-------------------------------------------------------------------------------
    void MakeTimeString(tm MakeTime,char *MyTimeString)
    {	strcpy(MyTimeString,form("%4.4u",MakeTime.tm_year+1900));strcat(MyTimeString,"-");    strcat(MyTimeString,form("%2.2u",MakeTime.tm_mon+1));strcat(MyTimeString,"-");
    strcat(MyTimeString,form("%2.2u",MakeTime.tm_mday));strcat(MyTimeString,"T");
    strcat(MyTimeString,form("%2.2u",MakeTime.tm_hour));strcat(MyTimeString,":");
    strcat(MyTimeString,form("%2.2u",MakeTime.tm_min));strcat(MyTimeString,":");
    strcat(MyTimeString,form("%2.2u",MakeTime.tm_sec));
    }
    //--------------------------------------------------------------------------------
    

    mit GCC-2.95 liess sich die 'form'-Funktion problemlos kompilieren. Mit GCC-3.3 bekomme ich jetzt die Fehlermeldung ==> 'form' undeclared.

    Kann mir jemand sagen womit ich 'form' ersetzen kann ? Kann ich die 'iomanip' library einbinden und die 'char *'-Variable (bzw. string) als stream behandeln. Also den '<<' anwenden ? Ich habe schon den ganzen Vormittag im Internet gesucht aber bisher nichts passendes gefunden.

    Included habe ich folgende libraries

    #include <sstream>
    #include <fstream>
    #include <iostream>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <math.h>
    #include <time.h>
    #include <string>

    Danke



  • Hi

    warum benutzt du nicht einfach stringstreams nebst manipulatoren ?



  • Oder halt

    sprintf(MyTimeString, "%4u-%2u-%2uT%2u:%2u:%2u",
            MakeTime.tm_year + 1900, MakeTime.tm_mon + 1, MakeTime.tm_mday,
            MakeTime.tm_hour, MakeTime.tm_min, MakeTime.tm_sec);
    

    ...wobei das mit stringstream definitiv c++iger ist. Außerdem könnte man dann auch gleich std::string benutzen.



  • den wust mit den manipulatoren will man sich nicht immer antun.
    Ich selbst verwende auch oft dann noch sprintf oder besser _snprintf (sicherer !)

    und der erzeugte string laesst sich immer noch in nen std::string pappen ...
    manchmal ! iss das sogar performanter ...
    Und versucht mal 64bit integers zu "streamen" 🙂

    Ciao ...



  • _snprintf? Wo kommt der Unterstrich her? In C99 heißt das jedenfalls snprintf, ohne _.

    Abgesehen davon hat stringstream auch echte Vorteile, wie z.B. Typsicherheit bei der Eingabe und die Verwendung von std::string, was dir das Speichermanagement abnimmt. Ich würde den Kram wohl so implementieren:

    #include <sstream>
    #include <string>
    
    std::string make_time_string(tm const &tstamp) {
      std::stringstream sstr;
    
      sstr << std::setfill('0')
           << std::setw(4) << tstamp.tm_year + 1900 << '-'
           << std::setw(2) << tstamp.tm_mon  +    1 << '-'
           << std::setw(2) << tstamp.tm_mday        << 'T'
           << std::setw(2) << tstamp.tm_hous        << ':'
           << std::setw(2) << tstamp.tm_min         << ':'
           << std::setw(2) << tstamp.tm_sec;
    
      return sstr.str();
    }
    


  • gab es dazu nicht die funktion asctime ?



  • Frag nich nach Sonnenschein 🙂
    unter VC6.0 gibts nur _snprintf, zumindest laut meiner MSDN 🙂

    Glaub C99 ist etwas zu neu 🙂

    Ciao ...



  • ...ich vermute allerdings, dass der Fragesteller, der mit gcc arbeitet, sich eher mäßig für die Unzulänglichkeiten der Microsoft-Bibliotheken interessiert.



  • @volkard: asctime ist nicht threadsafe, und asctime_r ist nur SUSv2, nicht ANSI-Standard, also z.B. unter Windows im Zweifel nicht erhältlich.



  • Hi

    man könnte auch boost::format nehmen. Ich würde jedenfalls alles andere als sprintf nehmen im normalfall.


Anmelden zum Antworten