begin process at 2012 05 28 15:01:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Fichier / Disque

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

vendredi 9 décembre 2005 à 11:49:09 | caractères/entiers: comment les différencier?

badboy38

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


--==OPEN.SOURCES.FREE.FR==-- site d'open source VB, VB.NET et TI!!!<
vendredi 9 décembre 2005 à 12:06:58 | Re : caactères/entiers: comment les différencier?

MoDDiB

Mets tes commentaires entre 2 balises ( @ ou # par exemple )
et ignore tout simplment tout ce qu'il y a entre ces 2 balises..
vendredi 9 décembre 2005 à 12:15:52 | Re : caactères/entiers: comment les différencier?

badboy38

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


--==OPEN.SOURCES.FREE.FR==-- site d'open source VB, VB.NET et TI!!!<
vendredi 9 décembre 2005 à 15:09:08 | Re : caactères/entiers: comment les différencier?

vdust

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 --

vendredi 9 décembre 2005 à 15:35:36 | Re : caactères/entiers: comment les différencier?

vecchio56

Administrateur CodeS-SourceS
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
lundi 12 décembre 2005 à 19:10:11 | Re : caractères/entiers: comment les différencier?

badboy38

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


--==OPEN.SOURCES.FREE.FR==-- site d'open source VB et TI!!!
mardi 13 décembre 2005 à 01:58:35 | Re : caractères/entiers: comment les différencier?

vdust

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);

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 --

mardi 13 décembre 2005 à 12:30:38 | Re : caractères/entiers: comment les différencier?

badboy38

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


--==OPEN.SOURCES.FREE.FR==-- site d'open source VB et TI!!!<
mardi 13 décembre 2005 à 18:21:37 | Re : caractères/entiers: comment les différencier?

vdust

un fscanf(fc, "%s\n", temp); fait exactement la même chose, mais en plus propre :)

-- Virtual Dust --



Cette discussion est classée dans : fichier, entiers, programme, caractères, différencier


Répondre à ce message

Sujets en rapport avec ce message

probléme pour mon projet [ par nina89 ] [color=red]bonjours tous[/color], Je suis débutant en Programmation et je veut créer en langage C 2 programme et j'y arrive pas[^^sad1] tous ce que J’ai créé un fichier contenant des chaînes de caractères [ par enoitnaillal ] Bonjour, J’ai créé un fichier contenant des chaînes de caractères, lorsque j’effectue une recherche et que la chaîne contient une lettre accentuée la Aide pour écire un programme! [ par corkycouenne ] bonjour! J'ai un tp d'informatique à préparer sauf que cette matière et moi font deux! XD J'aimerais bien des conseils des idées des exemples pour qu [c]s'est possible un programme comme sa ? [ par CreateurDeBug ] Bonjour, s'est possible un programme qu'ont luit poserais des questions et il ouvrirais le contenue d'un fichier texte en rapport avec se qu'on à dema [DOS]Question .bat [ par lakeeee ] Salut, Je voudrais créer un fichier .bat pour lancer un programme .exe qui s'exécute dans une fenêtre DOS. Mon programme se lance bien avec la comman probleme pagefile et programme C [ par ar1du62 ] Bonjour ! Voila my soucy ^^ <- qui me fais pas rire en fait : J'ai créé un programme qui tourne toute la journée sur une bécane windows xp et qui en problème lors de la lecture d'un fichier [ par pagoda ] Bonjour, j'ai un souci avec un programme que je dois faire dans le cadre d'un projet pour mon école d'ingé. Je dois en effet réaliser un programme q [Programme en C] Gestion d'un fichier texte dans un programme en C [ par Azshari ] Bonjour à tous Mon problème est le suivant, j'ai un fichier .FIL que j'aimerai exploiter. Voila ce qu'on peut trouver dans ce fichier lorsqu'on l'o c++: compiler un programme avec de nombreux fichier et dossier en un seul exe [ par roryaerugino ] Bonjour j'ai un programme contenant des dossiers et des fichiers. Je lance l'application par un .vbs Je souhaiterais compiler ce programme pour en fa correction programme sous isis [ par freeidea ] salut je demande aux programmeur du site de me corriger le probleme suivant vu sur schema sous isis: l'afficheur est programmé pour une marge de tempe


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,044 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales