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 ... */
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 :
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
"Nicolas Maupu" <_nmaupu_@_ens_._uvsq_._fr_> 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 :
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).
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 :
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
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
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 :)
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 :)