stringstream and str not synchronized

2019-09-02 20:15发布

问题:

I'm writing a simple parser in c++. I would like to remove leading whitespaces with std::ws.

bool            Parser::readWhiteSpace()
{
  std::cout << "Before : str=[" << this->_ss.str() << "], peek=[" << (char)this->_ss.peek() << ']'<< std::endl;
  this->_ss >> std::ws;
  std::cout << "After : str=[" << this->_ss.str() << "], peek=[" << (char)this->_ss.peek() << ']'<< std::endl;                                                                                                                                          

  return (true);
}

The output is :

Before : str=[   something], peek=[ ]
After :  str=[   something], peek=[s]

I don't understand why the stream and the str from the stream are not synchronized. Is it not supposed to affect the str ?

回答1:

The string stream has a pointer, the output position indicator, which points at the "next" character. By trimming leading whitespace, the backing buffer itself is not modified, but this position indicator is incremented. std::ws reads a character until it's a whitespace, thus your last peek would find this indicator pointing to s.