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"
)?也就是说,没有导致下一行开始下一行?
(例如,我知道。)
答案 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"
? (我不知道你的实施)