Почему parse_config_file устанавливает failbit в потоке? - PullRequest
0 голосов
/ 13 июня 2019

Эта минимальная программа использует boost::program_options для анализа stringstream. Как ни странно, после синтаксического анализа поток больше не находится в «хорошем» состоянии, и установлены как failbit, так и eofbit.

#include <iostream>
#include <sstream>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/parsers.hpp>
#include <boost/program_options/variables_map.hpp>

void test_stream(std::stringstream& s);

int main()
{
  using namespace std;
  namespace po = boost::program_options;

  stringstream s;
  s << "seed=3" << '\n';
  test_stream(s);

  po::options_description desc("");
  desc.add_options()
    ("seed", po::value<int>());
  po::variables_map vm;
  po::store(po::parse_config_file(s, desc, true), vm);
  po::notify(vm);

  test_stream(s);

  return 0;
}

void test_stream(std::stringstream& s)
{
  using namespace std;

  if (s.good())
    {
      cout << "stream is good" << endl;
    }
  else
    {
      cout << "stream is not good" << endl;
      if (s.rdstate() & ios_base::badbit)
    cout << "badbit is set" << endl;
      if (s.rdstate() & ios_base::failbit)
    cout << "failbit is set" << endl;
      if (s.rdstate() & ios_base::eofbit)
    cout << "eofbit is set" << endl;
    }
}

Выход:

stream is good
stream is not good
failbit is set
eofbit is set

Несмотря на то, что условие eof как-то ожидается, так как предположительно парсер считывал поток до EOF, почему также устанавливается бит перехода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...