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

badboy38 Messages postés 95 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 4 mars 2013 - 9 déc. 2005 à 11:49
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!!!<

8 réponses

MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
9 déc. 2005 à 12:06
Mets tes commentaires entre 2 balises ( @ ou # par exemple )
et ignore tout simplment tout ce qu'il y a entre ces 2 balises..
0
badboy38 Messages postés 95 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 4 mars 2013
9 déc. 2005 à 12:15
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!!!<
0
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
9 déc. 2005 à 15:09
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 --
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2005 à 15:35
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
badboy38 Messages postés 95 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 4 mars 2013
12 déc. 2005 à 19:10
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!!!
0
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 à 01:58
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 --
0
badboy38 Messages postés 95 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 4 mars 2013
13 déc. 2005 à 12:30
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!!!<
0
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
un fscanf(fc, "%s\n", temp); fait exactement la même chose, mais en plus propre :)


-- Virtual Dust --
0
Rejoignez-nous