4
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"

snow 包含"a"现在,如何查看行 ( "b+c") 的剩余字符?也就是说,不会导致下一个操作从下一行开始?

(例子是人为的,我知道。)

4

4 回答 4

3

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

ss.seekg(ss.beg);

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

于 2013-05-15T19:31:14.733 回答
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"

上面的问题是,如果 std::getline() 在 eof 之前找到它,它会丢弃一个 '\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"
于 2013-05-15T20:12:14.233 回答
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 的状态,因此不符合您编辑的标准。

于 2013-05-15T19:25:05.767 回答
1

解决您的问题的一个简单方法是使用另一个std::stringstreamfor 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"呢?(我不知道你的实现)

于 2013-05-15T19:25:17.173 回答