Votre avis sur ma fonction : cpp_sscanf (plus rapide que sscanf)
Bonjour à tous,
La fonction sscanf du C n'étant pas sécurisée, et donc presque inutilisable, j'ai décidé de coder un équivalent [extensible] en c++11 moderne.
Prototypes.
Code:
1 2 3
| (1)
template <class... Outs>
string::const_iterator cpp_sscanf::sscanf( string input, string pattern, char delimiter, Outs&... output_arguments ); |
Code:
1 2 3
| (2)
template <class Iterator, class... Outs>
Iterator cpp_sscanf::sscanf( Iterator begin, Iterator end, string pattern, char delimiter, Outs&... output_arguments ); |
Fonctionnalités.
- La fonction sscanf parse une chaine (input) de caractère selon un format fourni (pattern) et en extrait des valeurs (output_arguments).
- Elle retourne un itérateur vers la position où le parsing s'est arrêté.
- Les types pris en charge pour la sortie sont extensibles, via des type_traits.
- Grâce au c++, cette version est plus rapide que celle du C.
- Plus rapide que les std::istream (qui sont abominablement lents), et surtout, plus lisible.
- Bonne gestion des erreurs grâce aux exceptions.
- Testée.
Mini exemple.
Code:
1 2
|
cpp_sscanf::sscanf( "j'ai 10 ans" , "j'ai _ ans" , '_' , mon_age ); |
Exemple.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
#include "cpp_sscanf.h"
#include "parser_trait.h"
#include <string>
using namespace std;
int main(){
string chaine_a_tester = ...;
string pattern = "Julien : _ ans, Diane : _ ans";
double age_julien; double age_diane;
cpp_sscanf::sscanf( chaine_a_tester , pattern , '_' , age_julien, age_diane );
cout << "l'age de Julien est : " << age_julien << endl;
cout << "l'age de Diane est : " << age_diane << endl;
} |
Sources.
Les sources, les tests et le readme sont là :
https://bitbucket.org/Gauss_/library...anf/?at=master
Votre avis.
Qu'en pensez-vous ? Peut-on améliorer le code ? Cela vous semble-t-il utile ?