2012-05-15 65 views
0

我有一個看起來像這樣的數據字符串:stringstream可以解析這樣的東西嗎?

b = bool 
i = int 
sINT: = string whose length is INT followed by a : then the string 
m = int message id. 

例子:

m133s11:Hello Worldi-57989b0b1b0 

這將是:

Message ID 133 
String 'Hello World' length 11 
int -57989 
bool false 
bool true 
bool false 

有東西在STL,可以輕鬆地分析這個?

+0

'find'和'substr'會做的伎倆,但不容易; [boost spirit](http://boost-spirit.com/home/)可以輕鬆完成,但它不是標準庫的一部分。 – dasblinkenlight

+4

您不需要查找,因爲您知道實際解析的令牌有多長時間。這是一個LL(0)語法,你可以寫一個遞歸解析器 - 不需要STL。 –

+0

我想我最好自己做一下。 – jmasterx

回答

6

沒錯:

std::stringstream data("m133s11:Hello Worldi-57989b0b1b0"); 
while(parse(data)) 
{ 
    // 1 item was correctly removed from the stream 
} 

std::istream& parse(std::istream& data) 
{ 
    char format; 
    data >> format; 

    switch(format) 
    { 
     case 'i': int value; data >> value;break; 
     case 'm': int id;  data >> id; break; 
     case 'b': bool value; data >> value; break; 
     case 's': 
     { 
      std::size_t size; 
      char   x = '0'; 
      data >> size >> x; 
      if ((!data) || (x != ':')) 
      { // Something went wrong 
       data.setstate(std::ios_base::iostate::badbit); 
      } 
      else 
      { 
       std::string value(size, ' '); 
       data.read(&value[0], size); 
      } 
      break; 
     } 
    } 
    return data; 
} 
+0

現在,這是一個答案,謝謝! – jmasterx

+0

我想我應該把它放在一個while循環中,但是我想完成整個事情。 – jmasterx

+0

我如何跟蹤自己在哪裏,以便我可以順序解析每個令牌? – jmasterx

0

不是直接。鑑於它的複雜性,除非你想根據上下文把它看作一個字符串和拼接,我會說你最好用boost::regex來搜索你的模式。