lieber sone schrieb:
Arcoth schrieb:
Boost.Format?
Ist dir der Unterschied von scanf und printf bekannt?
Tut mir Leid, mein Fehler - ich meinte mich erinnern zu können, dass Boost.Format auch parst. Aber das ist offensichtlich nicht der Fall.
#include <iostream>
#include <sstream>
#include <limits>
std::istream& gen_scanf( std::istream& is,
char const* format )
{
while( *format )
if( is.get() != *format++ )
{
is.setstate( std::ios_base::failbit );
break;
}
return is;
}
template< typename Input >
void extract( std::istream& is, char const*, Input& input )
{
is >> input;
}
void extract( std::istream& is, char const*& format, std::string& input )
{
std::getline(is, input, *format++);
}
template< typename First, typename... Tail>
std::istream& gen_scanf( std::istream& is,
char const* format,
First& first, Tail&... tail )
{
while( *format && is )
{
if( *format == '%' )
if( *++format == '*' )
{
++format;
while( is && is.get() != *format );
++format;
}
else
{
extract(is, format, first);
return gen_scanf(is, format, tail...);
}
else if( *format++ != is.get() )
{
is.setstate( std::ios_base::failbit );
break;
}
}
return is;
}
template< typename First, typename... Tail>
std::istream& gen_sscanf( char const* input,
char const* format,
First& first, Tail&... tail )
{
std::istringstream stream{input};
return gen_scanf(stream, format, first, tail...);
}
int main ()
{
std::string a;
int b;
double c;
std::string line="abcdef delim var=1, 2 delim";
gen_sscanf(line.c_str(),"%* delim %=%, % delim",a,b,c);
std::cout << "a: " << a << '\n'
<< "b: " << b << '\n'
<< "c: " << c << '\n';
}
Das ist eine minimalistische Implementierung, die obigem entspricht.