Problème d'affichage dans le résultat de ma fonction C [C] - C - Programmation
Marsh Posté le 08-12-2015 à 16:19:45
fscanf( f , "%s %s %s %s %s", ...) ça ne ferait pas par hasard la rupture entre chaque élément sur les espaces ?
Conclusion tu dois revoir ta méthode de lecture...
Marsh Posté le 08-12-2015 à 16:23:15
TotalRecall a écrit : fscanf( f , "%s %s %s %s %s", ...) ça ne ferait pas par hasard la rupture entre chaque élément sur les espaces ? |
C'est justement l'objet de mon post, je voudrais de l'aide par rapport à cela
Marsh Posté le 08-12-2015 à 16:37:08
Ben par exemple :
Lecture ligne par ligne, si l'ordre est constant et le nombre d'éléments par adresse fixe.
Ou détection des lignes vides pour faire la rupture entre chaque adresse (préférable de tte façon en cas d'erreur dans le fichier)
Trouver comment faire de la lecture par ligne en C c'est pas bien compliqué, après y a plus qu'à écrire l'algo
Marsh Posté le 08-12-2015 à 16:42:06
TotalRecall a écrit : Ben par exemple : |
L'odre est constant mais le nombre d'éléments par adresses est fixe.
Peux tu me donner une réponse un peu plus précise avec un exemple stp ? ça m'aiderait de beaucoup pour la compréhension. Là je trouve que les réponses sont un peu vagues du coup je ne sais pas trop par ou commencer. Merci
Marsh Posté le 08-12-2015 à 16:57:44
J'ai pas fait de C depuis 15 ans, je préviens
Mais tu peux utiliser une fonction comme "fgets", qui prend un pointeur vers ton fichier, une longueur de buffer, et un buffer.
Je te laisse regarder comment ça s'utilise. Si t'as pu écrire ton code ci-dessus ça ne devrait pas te poser de difficulté !
Tu boucles dessus 11 fois (puisque tes adresses ont 10 lignes, la 11e sera soit une ligne vide soit la fin du fichier, sinon y a un pb)
Au cours de ta boucle tu te débrouilles pour assigner (en fonction de l'index de la boucle) le champ correspondant de l'adresse.
Attention, fgets ramène tout le contenu de la ligne, y compris le \r et/ou \n il me semble.
Y a ss doute quelques milliers d'autres façons de faire mais c'en est toujours une.
edit : tiens je viens de voir que tu as déjà utilisé fgets dans ton programme. Ca va faciliter les choses . C'est donc bien qu'une question d'algo au final, et la mauvaise utilisation de fscanf...
Marsh Posté le 08-12-2015 à 17:49:46
TotalRecall a écrit : J'ai pas fait de C depuis 15 ans, je préviens |
Justement le fgets je l'ai déjà utilisé mais pourquoi il n'arrive pas à prendre toute la ligne ? Comment utiliser au final le scanf ?
15 ans sans faire le C ouaaw je sais pas si tu pourrais bien m'aider du coup...
Marsh Posté le 08-12-2015 à 19:13:32
Code :
|
(fscanf( f , "%[^\n]\n%[^\n]\n%[^\n]\n%[^\n]\n%[^\n]\n", buff[0], buff[1], buff[2], buff[3], buff[4])) == 5
fscan va scanner en prenant d'un coup tout ce qui n'est pas un \n: %[^\n], suivi d'un \n et s'il n'en trouve pas 5 de suite, on a un échec.
A+,
Marsh Posté le 08-12-2015 à 19:36:37
(fscanf( f , "%[^\n]\n%[^\n]\n%[^\n]\n%[^\n]\n%[^\n]\n", buff[0], buff[1], buff[2], buff[3], buff[4])) == 5
fscan va scanner en prenant d'un coup tout ce qui n'est pas un \n: %[^\n], suivi d'un \n et s'il n'en trouve pas 5 de suite, on a un échec.
A+,[/quotemsg]
Merci Gilou je suis soulagé, il me manquait vraiment cette ligne pour résoudre mon problème
Marsh Posté le 08-12-2015 à 19:56:38
Noter que ce genre de manip est très hasardeuse, sauf avec du texte déjà formaté par un programme et dont on sait qu'il est 100% conforme à une spec.
Ça ne marchera pas si une ligne est vide par exemple, ça décalera le tout.
En y repensant,
while ((fscanf( f , " %[^\n] %[^\n] %[^\n] %[^\n] %[^\n]", buff[0], buff[1], buff[2], buff[3], buff[4])) == 5) {
serait préférable comme forme:
le blanc initial va bouffer un \n éventuel de la fin de ligne précédente, et le code fonctionnera que la dernière ligne ait un \n final ou pas.
Et en y repensant à deux fois,
while ((fscanf( f , "%[^\n] %[^\n] %[^\n] %[^\n] %[^\n] ", buff[0], buff[1], buff[2], buff[3], buff[4])) == 5) {
ou le blanc final bouffera le \n de fin de ligne s'il est présent est sans doute encore mieux, car plus lisible.
A+,
Marsh Posté le 08-12-2015 à 20:02:47
gilou a écrit : Noter que ce genre de manip est très hasardeuse, sauf avec du texte déjà formaté par un programme et dont on sait qu'il est 100% conforme à une spec. |
Ok c'est noté merci pour la précision
Marsh Posté le 09-12-2015 à 09:14:33
Je n'ai pas voulu suggérer le fscanf sur %[^\n]\n parce qu'effectivement si le fichier a une anomalie ça risque d'être le bordel pour récupérer le coup...
Marsh Posté le 09-12-2015 à 09:53:12
TotalRecall a écrit : Je n'ai pas voulu suggérer le fscanf sur %[^\n]\n parce qu'effectivement si le fichier a une anomalie ça risque d'être le bordel pour récupérer le coup... |
Ah d'accord je vois
Marsh Posté le 09-12-2015 à 11:52:10
Oui, si on veut une version plus blindée, il faut passer par du fgets.
Je posterai cela tout à l'heure, mais la, c'est rasage + douche.
Question à 10 balles: c'était nécessaire d'écrire ça en C? en perl, ça m'aurait pris 3 mn.
A+,
Marsh Posté le 09-12-2015 à 12:01:51
ReplyMarsh Posté le 09-12-2015 à 12:22:59
gilou a écrit : Oui, si on veut une version plus blindée, il faut passer par du fgets. |
Oui en C gilou...
Marsh Posté le 09-12-2015 à 12:54:44
gilou a écrit : Oui, si on veut une version plus blindée, il faut passer par du fgets. |
Par contre s'il s'agissait de lire une liste de nombres dans le fichier et afficher le nombre et son indice tel que:
1. 12
2. 2.567
3. 42.004
etc...
Comment l'adapterais tu avec ta méthode ?
Marsh Posté le 09-12-2015 à 14:21:19
Et si tu essayais un peu et tu nous montrais tes résultats ?
On veut bien aider mais on ne fait pas les devoirs, cf les règles du forum...
Marsh Posté le 09-12-2015 à 14:33:14
TotalRecall a écrit : Et si tu essayais un peu et tu nous montrais tes résultats ? |
Je n'ai pas demandé que l'on fasse de devoir à ma place, je bien formulé ma question: 'adapter à avec sa méthode à lui', ce qui voudrait dire que je l'ai fait avec une autre méthode.
Au début de mon post, j'ai bien montré mon travail puis j'ai rencontré une difficulté raison par laquelle j'ai demandé de l'aide.
Si je n'avais aucune volonté je postais directement ce qu'il était demandé à faire sans rien faire.
Ton message n'est pas du tout encourageant pour une personne qui a de la volonté de s'exercer et d'une manière ou d'une autre nous rencontrons tous des difficultés dans l'apprentissage. C'est bien de ces erreurs que nous apprenons avant de pouvoir maitriser.
Marsh Posté le 09-12-2015 à 14:35:43
Justement, tu as apparemment tous les outils et infos nécessaires, maintenant il faut réfléchir un peu pour adapter à chaque situation.
Lire des adresses ou des nombres c'est un peu pareil...
Si tu essaies et que tu butes sur un souci concret, ou bien si tu dis "j'ai fait ça, qu'est ce que tu en penses ?" c'est une chose, mais si tu dis "et maintenant j'ai ce cas là, est ce que tu peux m'aider Gilou", ça revient à faire faire le travail.
Marsh Posté le 09-12-2015 à 14:39:36
Un fichier avec seulement des nombres décimaux?
A la base, c'est une variation sur ce thème:
Code :
|
Testé sur:
12 |
Donne en résultat:
1. 12 |
A+,
Marsh Posté le 09-12-2015 à 14:42:03
Tu es bien trop serviable gilou, tu devrais être modérateur
Marsh Posté le 09-12-2015 à 14:56:31
gilou a écrit : Un fichier avec seulement des nombres décimaux?
Testé sur:
Donne en résultat:
|
Merci pour ta collaboration Gilou, c'est sympa. En effet celle que j'ai eu à faire n'était pas bien efficace et surtout généraliste je me rends compte. La tienne est bcp plus limpide
Marsh Posté le 09-12-2015 à 14:59:11
C'est assez épatant ce que fscanf peut faire. Mais par contre par conception ça n'est pas tolérant aux erreurs si le fichier ne colle pas à ce à quoi tu t'attends.
Marsh Posté le 09-12-2015 à 15:03:07
TotalRecall a écrit : Tu es bien trop serviable gilou, tu devrais être modérateur |
Pourquoi cela te pose tant de problème ? Le but du forum n'est il pas de demander de l'aide lorsque l'on bute sur un exercice ? En plus je trouve cela bien d'exposer chacun de nos problème car cela permet également à celui qui vient en aide de rencontrer d'autres difficultés pour tester déjà son niveau s'il est en mésure de le résoudre et se perfectionner encore plus.
C'est plutot avantageux dans les deux sens, autant pour celui qui apprend que pour celui qui maitriser.
La révision est la mère des sciences.
Marsh Posté le 09-12-2015 à 15:04:21
TotalRecall a écrit : C'est assez épatant ce que fscanf peut faire. Mais par contre par conception ça n'est pas tolérant aux erreurs si le fichier ne colle pas à ce à quoi tu t'attends. |
Je me rends compte que c'est aussi bénéfique pour toi en fin de compte ...
Marsh Posté le 09-12-2015 à 15:06:04
simon91 a écrit : Pourquoi cela te pose tant de problème ? Le but du forum n'est il pas de demander de l'aide lorsque l'on bute sur un exercice ? En plus je trouve cela bien d'exposer chacun de nos problème car cela permet également à celui qui vient en aide de rencontrer d'autres difficultés pour tester déjà son niveau s'il est en mésure de le résoudre et se perfectionner encore plus. |
Le smiley " " marque en général le second degré, n'y vois pas d'offense !
Et je t'ai dit plus haut ce que je voulais dire : même dans ton propre intérêt, il vaut mieux essayer de trouver toi même des solutions avant de demander le corrigé. Même si ton approche est moins efficace que celle de Gilou c'est toujours plus formateur comme ça.
Marsh Posté le 09-12-2015 à 15:07:37
simon91 a écrit : |
?
J'ai dit que je n'avais pas fait de C depuis 15 ans, pas que je veux m'y mettre
Marsh Posté le 09-12-2015 à 15:12:58
TotalRecall a écrit : C'est assez épatant ce que fscanf peut faire. Mais par contre par conception ça n'est pas tolérant aux erreurs si le fichier ne colle pas à ce à quoi tu t'attends. |
Voila pourquoi on peut utiliser fgets pour être tolérant aux pannes
Code :
|
Le seul truc contre lequel ce n'est pas blindé, c'est un fichier avec une ligne de taille > 255 caractères, mais c'est une hypothèse assez raisonnable ici.
Dans cette version la, une ligne vide en entrée sera comprise comme un champ vide.
A+,
Marsh Posté le 10-12-2015 à 12:42:15
Le seul truc contre lequel ce n'est pas blindé, c'est un fichier avec une ligne de taille > 255 caractères, mais c'est une hypothèse assez raisonnable ici.
Dans cette version la, une ligne vide en entrée sera comprise comme un champ vide.
A+
Ok merci Gilou, je pense que cette version n'est pas très différente de la première mais apparement bcp plus efficace
Marsh Posté le 08-12-2015 à 16:08:54
Bonjour,
J'ai un problème avec mon programme C qui a pour but de lire et d'afficher le contenu d'un fichier qui contient plusieurs adresses. Les adresses sont représentées d'une manière verticale sur une seule colonne pour faciliter au programme sa lecture.
Lorsque par exemple le nom de la voie est composé de plusieurs mots, le programme ne me l'affiche pas correctement.
Voici mon code :
Par exemple pour un fichier contenant ces adresses:
5
rue
Paul Froment
Paris
75001
2
allée
Pierre Gaspard
Paris
75019
J'ai ce résultat:
Numéro : 5
Voie : rue
Nom de la voie : Paul
Ville :Froment
Code postale : Paris
Numéro : 75001
Voie : 2
Nom de la voie :allée
Ville : Pierre
Code postale : Gaspard
Numéro : Paris
Voie : 75019
Nom de la voie :
Ville :
Comment puis je procéder pour remédier à ce problème ?
Merci d'avance pour l'aide.