我在c ++ 98中写了一个小解析器(是的,不能用11)。 我正在使用std :: stringstream,我通过引用不同的函数来传递它们,让它们称之为subparsers。 为了知道要调用哪个subparser,我需要知道stringstream中的下一个单词。 由于stringstream是一个istream,它确实有一个peek函数,它返回下一个字符而不移动迭代器/指针/它标记字符串流中的当前位置,但是当我需要下一个单词时我写了一个函数peekWord (暂时忽略注释行):
std::string Parser::peekWord(std::stringstream& sstream){
std::string myString = "EOF";
if(!sstream.eof()){
unsigned pos = sstream.tellg();
sstream >> myString;
//sstream.tellg();
sstream.seekg(pos);
}
return myString;
}
似乎很好用。
调试时我注意到,只要在指针/标记/事物移过最后一个字(返回-1)后调用tellg(),seekg(xBeforeLastPosition)
就不再工作了将位置设置为-1。
在tellg()
m的末尾stringstrea
的调用是否设置了failbit或类似的内容?我会直觉地希望void函数tellg()
没有副作用。
期待收到你们的回复:)
PIP
答案 0 :(得分:2)
tellg
被指定为:
返回:构建一个岗哨对象后,如果
fail() != false
,则返回pos_type(-1)
表示失败。否则,返回rdbuf()->pubseekoff(0, cur, in)
。
(istream::sentry
个对象用于检查输入是否可用。)
所以,是的,它会在EOF上设置failbit
。您可以通过选中eof()
并使用clear()
返回正常处理来检测此情况。