我正在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/

10-13 08:22