C ++ stringstream tellg()

时间:2014-06-18 04:51:04

标签: c++ stringstream

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

1 个答案:

答案 0 :(得分:2)

tellg被指定为:

  

返回:构建一个岗哨对象后,如果fail() != false,则返回pos_type(-1)表示失败。否则,返回rdbuf()->pubseekoff(0, cur, in)

istream::sentry个对象用于检查输入是否可用。)

所以,是的,它会在EOF上设置failbit。您可以通过选中eof()并使用clear()返回正常处理来检测此情况。