2014-12-02 51 views
2

我想使用std :: stringstream的在Objective-C++空的,但是這行後緩衝區將不會是空的:stringstream的緩衝區不會在Objective-C++

ss >> username >> name >> surname >> Id >> email; 

我的代碼如下所示:

std::shared_ptr<Self> string_to_self(const std::string & info){ 
    std::stringstream ss; 
    ss.str(info); 
    std::string username{""}; 
    std::string name{""}; 
    std::string surname{""}; 
    int Id{0}; 
    std::string email{""}; 

    ss >> username >> name >> surname >> Id >> email; 

    //ss.str() is the same as 'info'. 

stringstream在Objective-C++中的工作方式與在C++中的工作方式不同嗎? 是否有其他的選擇/更好的方法來做到這一點?

回答

0

也許std::istream_iterator會對你更有用嗎?

std::shared_ptr<Self> string_to_self(const std::string & info){ 
    std::stringstream ss(info); 
    std::istream_iterator<std::string> foo(ss); 
    const std::string username = *foo++; 
    const std::string name = *foo++; 
    const std::string surname = *foo++; 
    const int Id = std::stoi(*foo++); 
    const std::string email = *foo++; 

    if(foo == std::istream_iterator<std::string>()){ 
     //empty 
    }else{ 
     //not empty 
    } 
0

它按預期工作。串流不會清空,它只是調整操縱器的位置。

所以代碼等:

ss.str() 

返回複製的字符串流的內容作爲字符串(無論該偏移的讀指針具有串內),並且不改變所述內容的stringstream。

如果你想流字符串設定爲剩下的內容,你需要做一個人爲一點點:

ss.str(ss.tellg() == -1 ? "" : ss.str().substr(ss.tellg())); 

這就決定了搜索位置,如果它是-1,然後清空內容,否則將其設置爲搜索位置後面的子串。

1

它按預期工作,你應該自己清除它。您應該調用clear()來清除已設置的任何標誌,然後使用新值初始化它。

第一種方法可以避免調用const char構造的std::string

ss.clear(); 
ss.str(std::string()); 

,或者你可以簡單地

ss.clear(); 
ss.str(""); 

大多數現代編譯器避開const char構造函數的調用