2014-12-02 45 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构造函数的调用