Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Vive scanf!

2 réponses
Avatar
Nicolas Maupu
Bonjour à tous!

J'ai un petit problème suite à l'utilisation de fscanf.
Je voudrais parser un fichier ini simple, du style:

NAME1 = value1
NAME2 = value2
...

J'ai donc utilisé un fscanf avec le format:
%5[a-zA-Z0-9_-]%*[ ]%*1[=]%*[ ]%20[a-zA-Z0-9_-]

C'est-à-dire 5 caracères max (étant des lettres minuscules ou majuscules
des chiffres, _ ou -), une suite quelconque d'espaces, un caractère =,
une suite quelconque d'espaces et 20 caractères max (du même type que
précédemment).


Voici le code utilisé pour extraire les valeurs du fichier:
while((r=fscanf(fic, format_ci_dessus, buf_name, buf_value)) != EOF)
{
/* traitement ... */
}


Mais voilà, le scanf tourne en boule infinie...

Une idée?
Merci

--
Nico

2 réponses

Avatar
Anthony
"Nicolas Maupu" a écrit

Bonjour à tous!


Bonsoir,

J'ai un petit problème suite à l'utilisation de fscanf.
Je voudrais parser un fichier ini simple, du style:

NAME1 = value1
NAME2 = value2


Bon, d'abord la solution, ensuite mon avis...

J'ai donc utilisé un fscanf avec le format:
%5[a-zA-Z0-9_-]%*[ ]%*1[=]%*[ ]%20[a-zA-Z0-9_-]


Le format est faux... Après ton format, pour aller au bout d'un
enregistrement, il te faut un n. En effet, ton enregistrement est une ligne
complète, saut à la ligne compris. Donc ajoute un n à ton format, ca
fonctionnera beaucoup mieux. Là il ne passera même pas la première ligne, en
fait il va boucler infiniment sur elle. Il n'arrivera pas à prendre un
deuxième enregistrement.

Voici le code utilisé pour extraire les valeurs du fichier:
while((r=fscanf(fic, format_ci_dessus, buf_name, buf_value)) != EOF)


Ca me parait fortement dangereux ca... Il faut avoir super confiance en ton
fichier de données. Mieux vaut mettre :

while((r=fscanf(fic, format_ci_dessus, buf_name, buf_value)) !=
NumberOfValueToTake)

avec ici NumberOfValueToTake = 2.
Comme ca, si l'un des enregistrements n'a pas le bon format, on s'arrête. On
ne boucle pas à l'infini.

Ensuite un petit avis. Ce type de code est tout de même pas très beau. Pour
ma part, j'utiliserais plutôt le couple fgets()/strtok() pour faire ceci.
fgets() prend enregistrement par enregistrement, c'est à dire ligne par
ligne.
strtok() ensuite pour découper la chaine en `token' et validation de chaque
token ensuite (ici 3 dont un fixe et deux ayant un format précis).

--
Anthony Fleury

Avatar
Nicolas Maupu

Le format est faux... Après ton format, pour aller au bout d'un
enregistrement, il te faut un n. En effet, ton enregistrement est une ligne
complète, saut à la ligne compris. Donc ajoute un n à ton format, ca
fonctionnera beaucoup mieux.n


Ok, erreur de copier/coller



while((r=fscanf(fic, format_ci_dessus, buf_name, buf_value)) !=
NumberOfValueToTake)
C'est clair, je me suis aperçu de la boulette un peu plus tard!



Ensuite un petit avis. Ce type de code est tout de même pas très beau. Pour
ma part, j'utiliserais plutôt le couple fgets()/strtok() pour faire ceci.
fgets() prend enregistrement par enregistrement, c'est à dire ligne par
ligne.
strtok() ensuite pour découper la chaine en `token' et validation de chaque
token ensuite (ici 3 dont un fixe et deux ayant un format précis).
Juste une question de point de vu, fscanf tout comme fgets et strtok(qui

possede tout de meme quelques contraintes: pas thread safe...) sont
ANSI!


En tout cas, merci, j'y vois bien plus clair maintenant :)

--
Nico