OVH Cloud OVH Cloud

Partage d'une string en deux selon critères

42 réponses
Avatar
TigrouMeow
Bonjour,

Aujourd'hui j'ai une nouvelle question. J'ai un peu cherché et je vois pas
la bonne manière de faire ceci...

Je lis un fichier et j'ai une entrée de ce genre :
12 87
4783 49
1 0
429 452

Il s'agit de récupérer les deux nombres à chaque ligne. En Perl, c'est assez
aisé de le faire en utilisant une expression régulière. En C++, j'imagine
qu'il y a peut-etre une possibilité de faire ça, donc je préfère demander
avant de recoder un parseur.

Je vous remercie de votre aide une nouvelle fois ;)

10 réponses

1 2 3 4 5
Avatar
kanze
David wrote in message
news:<416c1712$0$28923$...

std::istringstream s( line ) ;
line >> i >> j >> std::ws ;


Je connaissais pas l'utilisation de ws comme ça.
Intéressant.

if ( ! line || line.peek() != EOF ) {


Pas sûr du line.peek(), probablement s.peek().


En fait, je me suis servi de line partout où il aurait fallu s :

s >> i >> j >> std::ws ;
if ( !s || s.peek() != EOF ) { ... }

Aussi, on pourrait aussi bien utiliser get à la place de peek.

// erreur...
}

En fait, si quelque part il y a une ligne qui manque un nombre, si
tu ne vérifies pas ligne par ligne, tu ne détectes l'erreur qu'à la
fin.

La question fondamentale, c'est qu'est-ce qu'on va faire avec les
erreurs qu'on détecte. Mon expérience suggère qu'on va afficher
l'erreur. Avec son numéro de ligne, pour que l'utilisateur peut le
rétrouver facilement. Dans ce cas-là, la lecture ligne par ligne est
tout à fait indiquée, pour faciliter aussi le comptage des lignes.


Ca parait très raisonnable.
Mon expérience me ferait croire qu'il n'y aurait pas grand monde pour
lire l'erreur afficher si le traitement n'indique pas une erreur
claire (genre return != 0 dans le main).


Tout à fait. Il faut d'une part écrire un message clair sur std::cerr
qui permet à l'utilisateur de rétrouver l'erreur, et de l'autre,
souvent, terminer le programme avec un code d'erreur, pour que quelqu'un
qui s'en sert dans un script peut arrêter le traitement.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
drkm
writes:

C'est vrai que on peut être plus souple avec les fichiers générés par un
programme. Et plus rigueureux, aussi -- un programme ne va pas insérer
un nombre aléatoire de blancs comme séparateur, par exemple. Une
vérification est quand même intéressant


Dans ce cas, j'aurais même tendance à être plus strict, et
n'accepter alors qu'un espace, par exemple, au lieu d'une séquence de
un ou plusieurs caractères blancs. Afin de détecter le plus de
symptômes possibles d'un fichier corrompu, d'une erreur de formatage,
d'un bug du programme générateur, etc.

--drkm

Avatar
Fabien LE LEZ
On Wed, 13 Oct 2004 22:03:05 +0200, drkm :

Dans ce cas, j'aurais même tendance à être plus strict, et
n'accepter alors qu'un espace, par exemple, au lieu d'une séquence de
un ou plusieurs caractères blancs.


Ça dépend de ce qu'indiquent les spécifications.
Je vois au moins un avantage à autoriser plusieurs blancs : permettre
d'aligner les nombres pour faciliter la lecture par un humain.


--
;-)

Avatar
David

Je suppose que tu serais content aussi avec un compilateur C++ qui ne
signalait aucune erreur, mais générait simplement du mauvais code si ton
programme avait une erreur.

Errare humanae est, comme on dit. Tu ne vas jamais pouvoir attraper
toutes les erreurs -- si l'utilisateur a tapé 110, quand il voulait
taper 10, et les deux valeurs sont raisonables, il n'y a rien que tu
puisses faire. Mais en général, plus on detecte d'erreurs possibles, et
plus on les localise, mieux ça vaut. (Tu ne seras probablement pas
content avec un compilateur qui affichait simplement "?", et s'arrêtait,
dès qu'il trouvait une erreur, non plus.)


Complétement d'accord avec toi.
Quand je programme ce genre de traitement, j'essaye d'évaluer
le risque et/ou l'intérêt de faire ou ne pas valider le fichier en entrée.
Dans le cas présent, je ne vois aucun intérêt de valider le fichier.
Pour un fichier aux données plus critiques, c'est évident qu'il faut
faire quelque chose.

Remarque que pour le compilateur, ça fait un moment que je me commente
juste de lire le numéro de ligne qui coïnce, pour aller dans le code
directement pour voir ce qui cloche (il suffit de voir pour la première
fois un message d'erreur sur une utilisation hasardeuse de la STL...).

C'est vrai que on peut être plus souple avec les fichiers générés par un
programme. Et plus rigueureux, aussi -- un programme ne va pas insérer
un nombre aléatoire de blancs comme séparateur, par exemple. Une
vérification est quand même intéressant, puisqu'on a pû te donner de
mauvais fichier. En revanche, dans ce cas-là, un message simple sans
localisation, etc., peut suffire.


Ca me va, même si le simple message est peut être
insuffisant. Si un fichier généré automatique est faux, il
me faut une explication.

Pas vraiment. fgets marche assez bien. (Évidemment, il faut limiter la
longueur des lignes. Mais dans la pratique, ce n'est pas forcement un
problème.)


Au vu des codes que j'ai lu, un moment je me suis même demandé si cette
fonction existait ;-)

Bon, en tout cas j'essayerai de bien préciser mes choix quand je proposerai
un exemple de code dans les news :-)

David.

Avatar
drkm
Fabien LE LEZ writes:

On Wed, 13 Oct 2004 22:03:05 +0200, drkm :

Dans ce cas, j'aurais même tendance à être plus strict, et
n'accepter alors qu'un espace, par exemple, au lieu d'une séquence de
un ou plusieurs caractères blancs.


Ça dépend de ce qu'indiquent les spécifications.
Je vois au moins un avantage à autoriser plusieurs blancs : permettre
d'aligner les nombres pour faciliter la lecture par un humain.


Bien sûr. J'ai l'impression que c'est d'ailleurs le genre de
« liberté » souvent présente dans des formats éditables directement
par des humains. Je disais juste que lorsque le format est
strictement destiné à être généré par un programme, c'est un genre de
fantaisie inutile.

--drkm


Avatar
drkm
David writes:

Dans le cas présent, je ne vois aucun intérêt de valider le fichier.


Mais il me semble que l'on ne sait pas grand-chose du contexte
d'utilisation du fichier d'entrée, ni même de son format. Je pense
que dans ce genre de choses, le défaut serait de toujours vérifier.
Mais si l'on a des raisons permettant d'éviter ces vérifications, bien
sûr, on peut s'en passer.

--drkm

Avatar
Loïc Joly
drkm wrote:

David writes:


Dans le cas présent, je ne vois aucun intérêt de valider le fichier.



Mais il me semble que l'on ne sait pas grand-chose du contexte
d'utilisation du fichier d'entrée, ni même de son format.


Hum, deux colonnes de chiffre... Coordonnées... Ca y est, c'est une
liste de cible pour des missiles nucléaires ! Bon, je pense que ce n'est
pas si grave de ne pas valider les données par tous les moyens possible. ;p

--
Loïc


Avatar
Arnaud Meurgues
David wrote:

Remarque que pour le compilateur, ça fait un moment que je me commente
juste de lire le numéro de ligne qui coïnce, pour aller dans le code
directement pour voir ce qui cloche (il suffit de voir pour la première
fois un message d'erreur sur une utilisation hasardeuse de la STL...).


Les compilateurs commencent à faire des progrès dans ce domaine. Les
messages d'erreur sur les templates de msvc7 sont beaucoup plus lisibles
que ceux que pouvaient produire msvc6, par exemple.

--
Arnaud
(Supprimez les geneurs pour me répondre)

Avatar
Christophe Lephay
David wrote:
Sur cet exemple, je n'ai pas eu un exemple de buffer overflow.


La possibilité d'exploiter un buffer overflow ne dépend pas de quelques
lignes de code mais de l'environnement complet. L'environnement en question
englobe tant le système d'exploitation que le reste du programme. La
non-vérification des données en entrée ne garantit pas un buffer overflow
mais ne garantit pas non plus qu'il est rendu possible. Le seul moyen de
garantir qu'il ne sera pas possible consiste à tester la validité. La notion
de garantie est la clé essentielle dans la mise en oeuvre de systèmes
complexes.

Il n'y a pas de règle précise sur ce que doit garantir chaque fonction. Le
minimum à l'heure actuelle me semble consister à indiquer, de préférence
d'une manière qu'il ne pourra ignorer (exceptions, assert, etc), au code
appelant que les données sont invalides (je ne parle pas des données en
entrées, qui ne devraient pas être connues dans le code appelant la fonction
chargée de les lire). De ce point de vue, strcpy n'est pas un modèle du
genre et n'est probablement pas un bon exemple de ce qu'il convient de faire
de manière générale.

Ce dont on peut débattre, c'est de l'utilité de vérifier les données en
entrée dans un petit exercice scolaire.

Chris

Avatar
drkm
"Christophe Lephay" writes:

Ce dont on peut débattre, c'est de l'utilité de vérifier les données en
entrée dans un petit exercice scolaire.


L'utilité étant de prendre de bonnes habitudes. Apprendre à, et
comment, vérifier les données.

Comment un étudiant penserait-il à faire ces vérifications si tout
le code qu'on lui fait pondre ne le vérifie pas ? Et pire, si
lorsqu'il les vérifie, se voit répondre que ça ne sert à rien, que ce
n'est pas le but de l'exo (situation vécue) !

--drkm

1 2 3 4 5