使用getline后如何查看剩余的stringstream字符?

时间:2013-05-15 19:20:40

标签: c++ getline stringstream

std::string s;
std::stringstream ss;
ss << "a=b+c" << std::endl << "d=e+f";

std::getline(ss, s, '=');   // gives me "a"
std::getline(ss, s);        /* gives me "b+c"  <- just want to peek: don't
                                                  want to change state of ss */
std::getline(ss, s, '+');   // BUT still want "b" here, not "d=e"

s现在包含"a"现在,如何查看该行的剩余字符("b+c")?也就是说,没有导致下一行开始下一行?

(例如,我知道。)

4 个答案:

答案 0 :(得分:3)

您可以使用istream :: seekg()恢复字符串流,如下所示:

ss.seekg(ss.beg);

然后你可以再读一遍。这比创建新的更好,因为它可以节省内存,并且速度更快。

答案 1 :(得分:3)

尝试:

std::getline(ss, s, '=');                     // gives me "a"
std::getline(ss, s);                          // gives me "b+c"
ss.seekg(-(s.size()+1) ,std::ios_base::cur);  // Roll back
                                              // Need to +1 becuase we throw away a character
                                              // with std::getline() that is not in the string.

std::getline(ss, s, '+');                     // gives me "b"

上面的问题是,如果在eof之前找到它,std :: getline()将丢弃'\ n'。但如果它首先找到了eof,那么我们就会遇到问题,因为+1会把我们放在错误的地方。所以它适用于上面的例子,但它会在最后一行失败,除非你保证每一行都被'\ n'终止

所以如果你不能提供保证,我们可以使用tellg():

std::getline(ss, s, '=');                     // gives me "a"
std::streampos  save = ss.tellg(); 
std::getline(ss, s);                          // gives me "b+c"
ss.seekg(save);                               // Roll back


std::getline(ss, s, '+');                     // gives me "b"

答案 2 :(得分:1)

您需要在stringstream之后创建一个新的s

std::getline(ss, s);        // gives me "b+c"
std::stringstream ss2(s);
std::getline(ss2,s, '+');   // will give b and maintain position in original ss

或者使用以下代码:

std::getline(ss, s, '+');   // will give b

编辑:第二个选项会更改ss的状态,因此不符合您的编辑标准。

答案 3 :(得分:1)

针对您的问题的简单解决方案是为std::stringstream使用另一个s

std::getline(ss, s, '='); // get "a"
std::getline(ss, s);

std::stringstream ss2(s); // create a stringstream with "b+c"
std::getline(ss2, s, '+'); // gets "b"

修改那么,为什么还要先阅读"b+c",而不是先"b"然后"c"? (我不知道你的实施)