
On Jun 13, 2017, at 3:09 PM, Belcourt, Kenneth via Boost-users <boost-users@lists.boost.org<mailto:boost-users@lists.boost.org>> wrote: [ snip …] Now we’re trying to automate some testing and we test our executable with an input file that has hundreds of lines like this: --inverse 1 --tolerance 1e-15 --rank 2 --inverse 1 --tolerance 1e-15 --rank 3 --inverse 1 --tolerance 1e-15 --rank 4 where each line is a separate test case that we run with the specified options. I was looking for a program options parser that can parse a string, so I can read one line of input from this file into a string, and run that test case: [ snip ] The only program option parsers I see are parse_command_line, parse_config_file, and parse_environment. Is there an easy way (without having to construct an argc/argv data structure) to parse a string of program options? Here’s my less than robust solution that converts a line of input into a config file syntax, which I pass into stringstream. char dashes[] = "--"; char dash[] = " -"; string::size_type loc; string buffer; // open file ifstream ifp(s); while (!ifp.eof() && ifp.good()) { // read a line of input getline(ifp, buffer); // replace all occurrences of double-dash with newline loc = buffer.rfind(dashes); while (string::npos != loc) { buffer[loc] = '\n'; buffer[loc+integer::one] = ' '; loc = buffer.rfind(dashes); } // replace all occurrences of space-dash with newline loc = buffer.rfind(dash); while (string::npos != loc) { buffer[loc+integer::one] = '\n'; loc = buffer.rfind(dash); } // check if first option has single dash without leading space if ('-' == buffer[0]) { // remove leading dash buffer.erase(integer::zero, integer::one); } stringstream ss(buffer); po::parse_config_file(ss, desc); } This still requires modifying our input files to use assignment form so this: --inverse 1 --tolerance 1e-15 --rank 2 becomes this: —inverse=1 —tolerance=1e-15 —rank=2 as the equal sign is required for config file syntax. How about a new api to parse command line options from a string? po::store(po::parse_string(buffer, desc), vm); N.