字符串流缓冲区在 Objective-C++ 中不会清空

Stringstream buffer won't empty in Objective-C++

本文关键字:清空 Objective-C++ 缓冲区 字符串      更新时间:2023-10-16

我想在 Objective-C++ 中使用 std::stringstream,但在此行之后缓冲区不会为空:

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'.

字符串流在 Objective-C++ 中的工作方式与在 C++ 中的工作方式不同吗?这是其他选择/更好的方法吗?

它按预期工作,您应该自己清除它。您应该调用clear()来清理任何已设置的标志,然后使用新值对其进行初始化。

第一种方法可以避免调用const char std::string的构造函数

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

或者你可以简单地

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

大多数现代编译器都避免调用const char构造函数

也许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
    }

它按预期工作。弦流不清空,它只是调整操纵器的位置。

所以代码像:

ss.str()

以字符串形式返回字符串流内容的副本(无论读取指针在字符串中的偏移量如何),并且不更改字符串流的内容。

如果要将流字符串设置为剩余内容,则需要做一些人为的操作:

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

这将确定查找位置,如果-1,则清空内容,否则将其设置为查找位置后面的子字符串。