$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] What else shall I do before reuse a stringstream for date parsing?
From: Bill David (billdavidcn_at_[hidden])
Date: 2009-02-16 05:20:09
2009/2/16 Dmitry Goncharov <dgoncharov_at_[hidden]>
>
>
> Bill David wrote:
>
>> 2009/2/16 Dmitry Goncharov <dgoncharov_at_[hidden]>
>>
>>
>>
>>> Bill David wrote:
>>>
>>>
>>>
>>>> To accelerate date parsing, I have writen a class to encapsulate the
>>>> date
>>>> parsing logic as following.
>>>> But the second call to CDateParser::parseDate(str) always failed to
>>>> parse
>>>> the date string. What else shall I do before reuse the stringstream
>>>> object?
>>>>
>>>> #include <stdio.h>
>>>>
>>>> #include <iostream>
>>>> #include <sstream>
>>>> using namespace std;
>>>>
>>>> #include "boost/date_time/posix_time/posix_time.hpp"
>>>> using namespace boost::gregorian;
>>>> using namespace boost::posix_time;
>>>>
>>>> class CDateParser
>>>> {
>>>> public:
>>>>   static void initialize();
>>>>   static time_t parseDate(const string& s);
>>>> private:
>>>>   static stringstream m_ss; //!< stringstream object used internally for
>>>> date parsing
>>>> };
>>>>
>>>> stringstream CDateParser::m_ss;
>>>>
>>>> time_t CDateParser::parseDate(const string& str)
>>>> {
>>>>   ptime p;
>>>>   m_ss.clear();
>>>>   m_ss << str;
>>>>   m_ss >> p;
>>>>   if (m_ss.fail()) {
>>>>       cout << "do not understand: " << str << endl;
>>>>       return 0;
>>>>   }
>>>>
>>>>   tm t = to_tm(p);
>>>>   return mktime(&t);
>>>> }
>>>>
>>>> void CDateParser::initialize() {
>>>>   time_input_facet* timefacet = new time_input_facet("%a, %d %b %Y
>>>> %H:%M:%S %z"); // will be automatically deleted by related locale object
>>>>   m_ss.imbue(locale(locale::empty(), timefacet));
>>>> }
>>>>
>>>> int main() {
>>>>   CDateParser::initialize();
>>>>
>>>>   string str;
>>>>   time_t t;
>>>>
>>>>   str = "Fri, 18 Jul 2008 11:53:14 GMT";
>>>>   t = CDateParser::parseDate(str);
>>>>   cout << ctime(&t) << endl;
>>>>
>>>>   str = "Sat, 19 Jul 2008 11:53:14 GMT";
>>>>   t = CDateParser::parseDate(str);
>>>>   cout << ctime(&t) << endl;
>>>> }
>>>>
>>>>
>>>>
>>>>
>>>>
>>> You should invoke m_ss.seekg(ios_base::beg) before each parsing.
>>> Also, be careful with to_tm(). It is buggy. See
>>> https://svn.boost.org/trac/boost/ticket/1859
>>>
>>>
>>
>>
>> But after I do that, both invocations report "do not understand".
>> And why clear can't rewind it?
>>
>>
> It works for me. I also replaced locale:empty() (non-existent on my system)
> with locale() in order to compile your example.
It seems you are using Linux while I am using Windows + VS2005.
But I have just tried on Linux. It is runnable, but the result is wrong. The
result should be:
Fri, 18 Jul 2008 11:53:14 GMT
Sat, 19 Jul 2008 11:53:14 GMT
>
> BR, Dmitry
>
>>
>>
>>
> _______________________________________________
> Unsubscribe & other changes:
> http://listarchives.boost.org/mailman/listinfo.cgi/boost
>