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 MSDNGlaub 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.