badboy38
Messages postés95Date d'inscriptionvendredi 14 janvier 2005StatutMembreDernière intervention 4 mars 2013
-
9 déc. 2005 à 11:49
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 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!!!<
badboy38
Messages postés95Date d'inscriptionvendredi 14 janvier 2005StatutMembreDerniè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!!!<
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 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.
badboy38
Messages postés95Date d'inscriptionvendredi 14 janvier 2005StatutMembreDerniè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!!!<