Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
elle ecrira dans un fichier
2007/03/06 12:10:30 Chaine a logguer : 45
Mais je ne sais pas comment m'y prendre, qu'elle operateur
surcharger....
Pour le moment, j'ai essayer ça, mais ça ne marche pas....
Quelqu'un peut-il m'eclairer sur la bonne façon pour surcharger << ???
Merci.
class LogSys{
public:
ofstream logfile;
LogSys();
~LogSys();
ostream& operator<<(ostream& flux);
};
LogSys::LogSys(){
logfile.open("c:Trace.log",ios::app);
}
LogSys::~LogSys(){
logfile.close();
}
ostream& LogSys::operator<<(const ostream& flux){
char now[31];
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime (&rawtime);
strftime(now,100,"%Y/%m/%d %H:%M:%S : ",timeinfo);
return logfile<<now<<flux<<endl;
}
Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
elle ecrira dans un fichier
2007/03/06 12:10:30 Chaine a logguer : 45
Mais je ne sais pas comment m'y prendre, qu'elle operateur
surcharger....
Pour le moment, j'ai essayer ça, mais ça ne marche pas....
Quelqu'un peut-il m'eclairer sur la bonne façon pour surcharger << ???
Merci.
class LogSys{
public:
ofstream logfile;
LogSys();
~LogSys();
ostream& operator<<(ostream& flux);
};
LogSys::LogSys(){
logfile.open("c:\Trace.log",ios::app);
}
LogSys::~LogSys(){
logfile.close();
}
ostream& LogSys::operator<<(const ostream& flux){
char now[31];
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime (&rawtime);
strftime(now,100,"%Y/%m/%d %H:%M:%S : ",timeinfo);
return logfile<<now<<flux<<endl;
}
Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
elle ecrira dans un fichier
2007/03/06 12:10:30 Chaine a logguer : 45
Mais je ne sais pas comment m'y prendre, qu'elle operateur
surcharger....
Pour le moment, j'ai essayer ça, mais ça ne marche pas....
Quelqu'un peut-il m'eclairer sur la bonne façon pour surcharger << ???
Merci.
class LogSys{
public:
ofstream logfile;
LogSys();
~LogSys();
ostream& operator<<(ostream& flux);
};
LogSys::LogSys(){
logfile.open("c:Trace.log",ios::app);
}
LogSys::~LogSys(){
logfile.close();
}
ostream& LogSys::operator<<(const ostream& flux){
char now[31];
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime (&rawtime);
strftime(now,100,"%Y/%m/%d %H:%M:%S : ",timeinfo);
return logfile<<now<<flux<<endl;
}
"condo4" writes:Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exemple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recherche
dans les archives.
"condo4" <c4@saint-pal.com> writes:
Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exemple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recherche
dans les archives.
"condo4" writes:Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exemple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recherche
dans les archives.
"condo4" writes:Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exemple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recherche
dans les archives.
En général mais si il crée son streambuf il va avoir un log du type
2007-03-06 13:20:42 - Chaine a logguer :
2007-03-06 13:20:42 - 45
Ici, il faut donc passer par une technique du genre RAII (cf mon autre
post)
"condo4" <c4@saint-pal.com> writes:
Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exemple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recherche
dans les archives.
En général mais si il crée son streambuf il va avoir un log du type
2007-03-06 13:20:42 - Chaine a logguer :
2007-03-06 13:20:42 - 45
Ici, il faut donc passer par une technique du genre RAII (cf mon autre
post)
"condo4" writes:Bonjour,
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exemple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recherche
dans les archives.
En général mais si il crée son streambuf il va avoir un log du type
2007-03-06 13:20:42 - Chaine a logguer :
2007-03-06 13:20:42 - 45
Ici, il faut donc passer par une technique du genre RAII (cf mon autre
post)
"condo4" writes:Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exem ple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recher che
dans les archives.
En général mais si il crée son streambuf il va avoir un log du type
2007-03-06 13:20:42 - Chaine a logguer :
2007-03-06 13:20:42 - 45
or il veut
2007-03-06 13:20:42 - Chaine a logguer : 45
Ici, il faut donc passer par une technique du genre RAII (cf mon autre
post) ou alors une stream à état:
a.logbegin();
a<<...;
a.logend();
Ce qui pose d'autres problèmes (pas pratique en environement multi
thread, design a état pas pratique).
"condo4" <c4@saint-pal.com> writes:
Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exem ple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recher che
dans les archives.
En général mais si il crée son streambuf il va avoir un log du type
2007-03-06 13:20:42 - Chaine a logguer :
2007-03-06 13:20:42 - 45
or il veut
2007-03-06 13:20:42 - Chaine a logguer : 45
Ici, il faut donc passer par une technique du genre RAII (cf mon autre
post) ou alors une stream à état:
a.logbegin();
a<<...;
a.logend();
Ce qui pose d'autres problèmes (pas pratique en environement multi
thread, design a état pas pratique).
"condo4" writes:Je souhaite créer une classe pour créer des log.
Class SysLog
j'aimerai utiliser comme ceci :
SysLog a;
a<<"Chaine a logguer : "<<45;
La technique habituelle consiste a creer ton propre streambuf. Un exem ple
dans la FAQ. On doit pouvoir en trouver d'autres en faisant une recher che
dans les archives.
En général mais si il crée son streambuf il va avoir un log du type
2007-03-06 13:20:42 - Chaine a logguer :
2007-03-06 13:20:42 - 45
or il veut
2007-03-06 13:20:42 - Chaine a logguer : 45
Ici, il faut donc passer par une technique du genre RAII (cf mon autre
post) ou alors une stream à état:
a.logbegin();
a<<...;
a.logend();
Ce qui pose d'autres problèmes (pas pratique en environement multi
thread, design a état pas pratique).
class LogInserter : public Gabi::SimpleInserter
{
public:
explicit LogInserter(
std::string const& format = "%Y-%m-%d %H:%M:%S: " )
void startRecord(){
time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
char buffer[ 1000 ] ;
if ( strftime( buffer, sizeof( buffer ), myFormat.c_str(), &t )
[...]
class LogInserter : public Gabi::SimpleInserter
{
public:
explicit LogInserter(
std::string const& format = "%Y-%m-%d %H:%M:%S: " )
void startRecord(){
time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
char buffer[ 1000 ] ;
if ( strftime( buffer, sizeof( buffer ), myFormat.c_str(), &t )
[...]
class LogInserter : public Gabi::SimpleInserter
{
public:
explicit LogInserter(
std::string const& format = "%Y-%m-%d %H:%M:%S: " )
void startRecord(){
time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
char buffer[ 1000 ] ;
if ( strftime( buffer, sizeof( buffer ), myFormat.c_str(), &t )
[...]
James Kanze wrote on 06/03/2007 14:45:time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisant
James Kanze wrote on 06/03/2007 14:45:
time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisant
James Kanze wrote on 06/03/2007 14:45:time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisant
James Kanze wrote on 06/03/2007 14:45:
quelques remarques, pour (garder) la forme ;)class LogInserter : public Gabi::SimpleInserter
{
public:
explicit LogInserter(
std::string const& format = "%Y-%m-%d %H:%M:%S: " )
pourquoi "explicit" ? std::string ne peut pas être construit à partir
d'un char* ? cela a un sens (fort) lorsqu'un seul constructeur est défi ni ?
void startRecord(){
time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisantchar buffer[ 1000 ] ;
vraiment gourmand en pile !!
if ( strftime( buffer, sizeof( buffer ), myFormat.c_str(), &t )
surtout pour repasser ce pointeur.[...]
bon, le reste (donc juste l'essentiel) c'est du tout bon ...
James Kanze wrote on 06/03/2007 14:45:
quelques remarques, pour (garder) la forme ;)
class LogInserter : public Gabi::SimpleInserter
{
public:
explicit LogInserter(
std::string const& format = "%Y-%m-%d %H:%M:%S: " )
pourquoi "explicit" ? std::string ne peut pas être construit à partir
d'un char* ? cela a un sens (fort) lorsqu'un seul constructeur est défi ni ?
void startRecord(){
time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisant
char buffer[ 1000 ] ;
vraiment gourmand en pile !!
if ( strftime( buffer, sizeof( buffer ), myFormat.c_str(), &t )
surtout pour repasser ce pointeur.
[...]
bon, le reste (donc juste l'essentiel) c'est du tout bon ...
James Kanze wrote on 06/03/2007 14:45:
quelques remarques, pour (garder) la forme ;)class LogInserter : public Gabi::SimpleInserter
{
public:
explicit LogInserter(
std::string const& format = "%Y-%m-%d %H:%M:%S: " )
pourquoi "explicit" ? std::string ne peut pas être construit à partir
d'un char* ? cela a un sens (fort) lorsqu'un seul constructeur est défi ni ?
void startRecord(){
time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisantchar buffer[ 1000 ] ;
vraiment gourmand en pile !!
if ( strftime( buffer, sizeof( buffer ), myFormat.c_str(), &t )
surtout pour repasser ce pointeur.[...]
bon, le reste (donc juste l'essentiel) c'est du tout bon ...
Sylvain wrote:James Kanze wrote on 06/03/2007 14:45:time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisant
C'est une demi-solution au problème de multi-thread de localtime.
localtime utilise un buffer statique : en le recopiant immédiatement on
réduit le risque qu'il soit écrasé par un autre thread. Sans l'emp écher.
J'ai du code qui utilise plutôt que localtime une macro à laquelle on
passe en argument now et tm t :
- la macro appelle localtime_r là où il est disponible,
- sous Windows elle appelle localtime en faisant la même chose
qu'au-dessus. Pour Windows, ce n'est pas grave, car le buffer utilisé
par localtime est en fait du thread specific memory.
Pour un système où on a ni l'un, ni l'autre, il vaut mieux réimpl émenter
complètement un équivalent de localtime_r.
Sylvain wrote:
James Kanze wrote on 06/03/2007 14:45:
time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisant
C'est une demi-solution au problème de multi-thread de localtime.
localtime utilise un buffer statique : en le recopiant immédiatement on
réduit le risque qu'il soit écrasé par un autre thread. Sans l'emp écher.
J'ai du code qui utilise plutôt que localtime une macro à laquelle on
passe en argument now et tm t :
- la macro appelle localtime_r là où il est disponible,
- sous Windows elle appelle localtime en faisant la même chose
qu'au-dessus. Pour Windows, ce n'est pas grave, car le buffer utilisé
par localtime est en fait du thread specific memory.
Pour un système où on a ni l'un, ni l'autre, il vaut mieux réimpl émenter
complètement un équivalent de localtime_r.
Sylvain wrote:James Kanze wrote on 06/03/2007 14:45:time_t now = time( NULL ) ;
tm t = *localtime( &now ) ;
pourquoi recopier la struct tm sur la pile ?
le pointeur retourné est suffisant
C'est une demi-solution au problème de multi-thread de localtime.
localtime utilise un buffer statique : en le recopiant immédiatement on
réduit le risque qu'il soit écrasé par un autre thread. Sans l'emp écher.
J'ai du code qui utilise plutôt que localtime une macro à laquelle on
passe en argument now et tm t :
- la macro appelle localtime_r là où il est disponible,
- sous Windows elle appelle localtime en faisant la même chose
qu'au-dessus. Pour Windows, ce n'est pas grave, car le buffer utilisé
par localtime est en fait du thread specific memory.
Pour un système où on a ni l'un, ni l'autre, il vaut mieux réimpl émenter
complètement un équivalent de localtime_r.