Caractères/entiers: comment les différencier?

Messages postés
95
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
4 mars 2013
- - Dernière réponse : vdust
Messages postés
43
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007
- 13 déc. 2005 à 18:21
Bonjour,



Débutant en C, je programme sous linux. Je suis en train de créer un
programme qui doit aller chercher des données numériques dans un
fichier. Jusque là c'est simple, j'utilise la fonction fscanf, mais
lorsque je rajoute des commentaires dans le fichier texte, le programme
perd les pédales et lit x fois de suite le même nombre.

Comment faire pour que le programme ignore les commentaires et continue la lecture des nombres dans l'ordre?



Merci pour vos réponses

BadBoy38


<hr size="2" width="100%">--==OPEN.SOURCES.FREE.FR==-- site d'open source VB, VB.NET et TI!!!<
Afficher la suite 

8 réponses

Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
0
Merci
Mets tes commentaires entre 2 balises ( @ ou # par exemple )
et ignore tout simplment tout ce qu'il y a entre ces 2 balises..
Commenter la réponse de MoDDiB
Messages postés
95
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
4 mars 2013
0
Merci
C'est une bonne idée, mais le problème reste quand même... Comment,
dans ces cas là, vérifier que les nombres qui sont utiles au programme
ne sont pas remplacés par des lettres?

BadBoy38


<hr size="2" width="100%">--==OPEN.SOURCES.FREE.FR==-- site d'open source VB, VB.NET et TI!!!<
Commenter la réponse de badboy38
Messages postés
43
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007
0
Merci
Pour pouvoir ignorer les commentaires, on peut s'y prendre en 2 étapes :


Tout d'abord, récupérer le contenu du fichier dans un buffer.


Ensuite, supprimer les commentaires en recherchant les balises.


Puis traiter la chaîne nettoyée avec sscanf



-- Virtual Dust --
Commenter la réponse de vdust
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
En fait ce n'est pas un problème si simple, ca revient à écrire un parser. Par exemple, si les commentaires sont les caractères suivant //, il faut faire attention qu'on n'est pas dans une chaine de caractères
Par contre, je ne comprends pas le problème de différencier des entiers et des caractères
Commenter la réponse de vecchio56
Messages postés
95
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
4 mars 2013
0
Merci
Bonsoir,



D'abord, merci pour vos réponses même si elles ne correspondent pas
tout à fait à ce que j'attends. Un exemple du fichier à traiter:



-----------Début du fichier----------

2= >taille matrice

Matrice A

5 8

4 6

Matrice B

8 -4

3 9

-----------Fin du fichier--------------



Les questions sont: 1) comment ne "voir" que les nombres?


2) comment éviter une lettre à la place d'un des nombres?



Merci
BadBoy38


<hr size ="2" width="100%">--==OPEN.SOURCES.FREE.FR==-- site d'open source VB et TI!!!
Commenter la réponse de badboy38
Messages postés
43
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007
0
Merci
Ce qu'il faut garder à l'esprit, c'est
que pour lite un fichier, il faut en connaître le format. Avec ton
exemple, j'en déduit que le format général de ton fichier est (et il
doit toujours être du même type) :



-----------Début du fichier-----------

tailleMatrice chaineAIgnorer

nomMatrice1

[matrice]

nomMatrice2

[matrice]

nomMatrice3

...

------------Fin du fichier------------



Maintenant, avec fcanf, le détail est simple : si la fonction ne trouve
pas l'entrée demandée dans le format, elle ne stoque rien dans la
variable associée et arrête de scanner le fichier. Par exemple, si mon
fichier contient "toto" et que je fais



j = -1;

i = fscanf(mon_fichier, "%d", j);



i contient la valeur 0 (le nombre de valeurs correctement lues) et j contient -1 (valeur par défaut).

En règle générale, comme un fichier a un format bien défini, lorsqu'une chaîne ne correspond pas à ce que l'on attend,

c'est qu'il y a une erreur de syntaxe (que l'on signale à
l'utilisateur). S'il y a un caractère non numérique alors que tu veux
un nombre, la fonction abandonne sans rien lire. C'est pour ça que ta
fonction boucle toujours sur la même valeur, si tu essaies de lire un
nombre alors qu'il y a autre chose. C'est pour ça aussi qu'il est
important de bien définir le format du fichier pour savoir à chaque
étape ce que l'on doit lire ensuite. Dans la structure précédente, tu
as une ligne qui identifie la matrice suivante ("Matrice A", "Matrice
B", ...). Tu dois donc la lire (= récupérer, même si tu ne t'en sers
pas) par une instruction du type suivant :



fscanf(fichier, "%s\n", temp);



où temp est un buffer de type char : char temp[256]; par exemple.

(Note : la première ligne peut-être de la même manière lue avec fscanf(fichier, "%d%s\n", n, temp); si tu souhaites récupérer la taille de la matrice dans une variable int n;)



Une fois cette ligne lue, tu sais ensuite que tu attends les valeurs de
la matrice. Attention ! Si jamais la ligne "nomMatriceN" n'est pas
présente, l'instruction donnée précédemment lira quand même la ligne.
D'où l'importance encore une fois d'un format fixe pour le fichier.



A chaque fois que tu exécute fscanf, je te conseille de vérifier
également sa valeur de retour qui est le nombre de valeurs lues et
stoquées dans les variables passées en arguments de fscanf. Si elle
vaut 0 ou est inférieure au nombre de valeurs souhaitées, c'est que le
format attendu ne correspondait pas à ce que contenait le fichier.
Enfin, la fonction retourne EOF si la fin du fichier est atteinte (dans
le cas seulement où aucune valeur n'a été lue).



J'espère que cela pourra t'aider.



Je te conseille aussi de lire attentivement la page du man concernant
fscanf pour en comprendre le fonctionnement plus en détaille.


-- Virtual Dust --
Commenter la réponse de vdust
Messages postés
95
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
4 mars 2013
0
Merci
Bonjour,



Merci pour vos réponses. J'ai trouvé une solution pas très propre à mon
problème, mais qui fonctionne: while(fgetc(fc)!= '\n'){} pour lignes de
commentaires...


BadBoy38


<hr size ="2" width="100%">--==OPEN.SOURCES.FREE.FR==-- site d'open source VB et TI!!!<
Commenter la réponse de badboy38
Messages postés
43
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007
0
Merci
un fscanf(fc, "%s\n", temp); fait exactement la même chose, mais en plus propre :)


-- Virtual Dust --
Commenter la réponse de vdust