【问题标题】:How do you get the remaining string after a string extracted from a sstream variable?从 sstream 变量中提取字符串后,如何获取剩余的字符串?
【发布时间】:2011-06-08 23:13:25
【问题描述】:

就像我有一个 stringstream 变量包含 "abc gg rrr ff"

当我在那个stringstream 变量上使用>> 时,它给了我"abc"。我怎样才能得到剩余的字符串:" gg rrr ff"?似乎str()rdbuf() 都不起作用。

【问题讨论】:

    标签: c++


    【解决方案1】:

    您可以使用std::getline 从流中获取字符串的其余部分:

    #include <iostream>
    #include <sstream>
    
    using namespace std;
    
    int main() {
            stringstream ss("abc gg rrr ff");
            string s1, s2;
            ss >> s1;
            getline(ss, s2); //get rest of the string!
            cout << s1 << endl;
            cout << s2 << endl;
            return 0;
    }
    

    输出:

    abc
    gg rrr ff
    

    演示:http://www.ideone.com/R4kfV

    有一个重载的std::getline 函数,其中第三个参数带有一个分隔符,您可以在该分隔符上读取字符串。见std::getline的文档:

    【讨论】:

    • @draw:我只能猜测,但也许它确实通过operator&gt;&gt; 读取了所有内容,并且只填充了读取之间的空白分隔符? :|
    • @draw(和@Xeo):std::getline 尊重流行为。在流行为中,您不能多次读取 same 输入。这就是流的意思。在这里查看我的答案以详细了解流的含义:stackoverflow.com/questions/6010864/…
    • 之所以有效,是因为它与std::getline 在应用于std::cout 时所做的相同:从当前流位置开始,一直读取到分隔符(默认为\n)或结束-文件。
    • 由于字符串可能包含'\n',getline(ss, s2, '\0'); 可能会更好。
    • 使用 Visual Studio 2017 执行此操作时,我实际上在第二个字符串的第一个位置得到了一个空格,例如“gg rrr ff”。我认为 getline 或“>>”也会摆脱那个。
    【解决方案2】:
    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    
    int main()
    {
        string str("123 abc");
        int a;
        istringstream is(str);
        is >> a;
    
        // here we extract a copy of the "remainder"
        string rem(is.str().substr(is.tellg()));
    
        cout << "Remaining: [" << rem << "]\n";
    }
    

    【讨论】:

    • 这是真正好的答案,因为它不受 eols 的影响。它只会读到流的末尾。
    【解决方案3】:
    std::istringstream input;
    int extracted;
    input >> extracted;
    

    IMO,您可能做的最简单的事情是:

    std::stringstream tmp;
    tmp << input.rdbuf();
    std::string remainder = tmp.str();
    

    这在性能方面并不是最优的。否则,直接访问stringbuffer(可能在流上使用rbuf().pubseekpostellg...尚未测试)。

    【讨论】:

    • 那么rdbuf() 存储剩余的字符串?
    • rdbuf() 实现流的缓冲区;我相信存储所有数据,包括已经提取的数据。现在,operator&lt;&lt;streambuf 的定义方式是,它会做正确的事情,而您不必担心流的位置。
    【解决方案4】:

    std::getline

    getline 从输入流中读取字符并将它们放入字符串中

    【讨论】:

      【解决方案5】:

      或者,如果您需要字符串的其余部分,您可以使用std::getline(my_stringstream, result, EOF),其中result 是包含结果的std::string

      【讨论】:

      • 分隔符只能是char,而a实际EOF不会暴露给getline,所以会被解释为char \xff(宏EOF定义为(-1) )。如果字符串中不存在该字符,它似乎才有效。
      【解决方案6】:

      继续使用operator&gt;&gt;,它将以空格分隔的部分提取其余部分。

      【讨论】:

      • 我担心的是我想在剩余的字符串中留下空格,我正在尝试使用子字符串
      猜你喜欢
      • 2021-05-10
      • 2016-05-08
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多