我正在c++ 98中编写一个小解析器(是的,不能使用11)。
我正在使用std::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
调用是否设置了故障位或类似的设置?我直觉上希望void函数tellg()
没有副作用。期待收到你们的来信:)
点子
最佳答案
tellg
是这样指定的:
(istream::sentry
对象用于检查输入是否可用。)
因此,是的,它将在EOF上设置failbit
。但是,您可以通过检查eof()
并使用clear()
返回正常处理来检测此问题。
关于c++ - C++ stringstream tellg(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24277273/