Récupérer une chaîne de caractère dans un fichier - Ada - Programmation
Marsh Posté le 16-05-2006 à 21:13:20
Salut stupid_coder,
Je ne sais pas pourquoi l'erreur End_Of_File est levée, je vais cherché un peut mais il y a Matrix ce soir à la télé
J'ai essayé get_line, ça marche ?
tu ne peut pas utiliser Length sans get_line !
Si tu n'affiche rien c'est normal, tu ne fais aucun appel a une procedure d'affichage !
Marsh Posté le 16-05-2006 à 21:29:35
j'ai déjà eu le problème de End_Error ; Je ne sais pas le resoudre ; End_Error est levée losrqu'on assai de lire audela de la fin du fichier;
donc soit on lis caractere par caractere et la End_Of_Line marche comme on s'y attent,
soit tu traite l'exception et ça roule ; c'est une exception a la con ; c'est tout.
Marsh Posté le 16-05-2006 à 21:55:47
Bonjour Jovalise,
Comment sais tu que c'est l'erreur end_of_file qui lève l'erreur ?
Le changement suivant :
while not(End_Of_File(F)) loop--tant que pas fin de fichier
while not(end_of_line)loop
get(f,line);
for I in 1..Length loop
if Line(i)='I' then
Get(F,Line);
put(f,line);
end if;
......
me donne la possibilité de taper des caractères et ensuite génère l'erreur...
Je pensais aussi utiliser à la place de "while not" un "exit when" pour le "end_of_file" mais c'est pire...
Marsh Posté le 16-05-2006 à 23:52:06
oui , pardon , j'ai fait une erreur, il falait lire : "Je ne sais pas pourquoi l'erreur End_Error est levée, j
mais que fais-tu en fait ? tu lis dans un fichier, et dans l'entré standard ? s'ai bizare ce que tu fait
Marsh Posté le 17-05-2006 à 01:54:14
j'ai édité le texte d'origine, pas très malin...
Marsh Posté le 17-05-2006 à 02:20:04
Après quelques changements de type je peux affirmer :
if (Line ='I')
est possible si line est un type charactère et non un sous type string (la comparaison '=' ne fonctionne pas sinon)
Marsh Posté le 17-05-2006 à 03:19:55
Dernier post de la soirée ou premier de la matinée c'est selon...
Jovalise, j'ai extrait une partie intéressante quand tu m'as dit que je lisais dans le fichier et l'entrée standard...
for I in 1..Lg loop--lg:natural;
Get(F,Line);--f:file_type;line:character;
if Line ='I'
then
get(f,car); --avec car:character;
put(car);
skip_line;--saut de ligne je pense
end if
...
les 3 lignes s'affichent consécutivement mais un message d'erreur sur les I/O_exception_end_error 396 aura raison de l'algo...
see u soon, bonne nuit à tous !
Marsh Posté le 17-05-2006 à 17:06:10
Peut-tu mettre ton code ici, parceque honnêtement galérer plusieurs jours sur la lecture d'un fichier texte, c'est pas top...
Marsh Posté le 18-05-2006 à 23:48:55
Bonsoir tout le monde,
De retour avec des balises comme ça, la cafetière qui déborde dans tous les sens, mais plus pour longtemps...
Bref, j'ai une solution pour afficher qui fonctionne, je rappelle le contexte:
afficher les lignes d'un fichier sur la sortie standard.
Cependant la boucle me met dedans quand je l'utilise, donc c'est pas top...
lignes.txt
--debut fichier
a 1 2 3 4
B 4 6 7 8
c 9 10 11 12
--fin fichier
-- debut code
Code :
|
--fin code
Le résultat donne ceci, une par une les lignes:
a 1 2 3 4
B 4 6 7 8
c 9 10 11 12
Un code parfait dans un monde parfait...
Cependant,néanmoins... je veux "identifier" chaque ligne par le caractère en début de ligne pour afficher le "contenu".
L'exemple ici est simplifié mais dans la réalité je peux avoir plusieurs 'a','b' ou 'c'...
Marsh Posté le 19-05-2006 à 02:17:09
Bon d'abord, il manque un new_line pour afficher ce que tu montres.
Ensuite : ça sert à quoi d'identifier une ligne par le caractère de début de ligne
Marsh Posté le 19-05-2006 à 21:07:02
Bonjour apprentitux,
Bon je vais aller un peu plus loin dans les explications...
Actuellement le fait de lire dans un fichier est une prmière étape.
Ensuite, le contenu de ce fichier sera réutilisé plus tard dans mon algotithme
L'exemple que je donne ici est simplifiée :
Le contenu utilisé est préformaté comme si nous avions ceci
exemple
a 01 01 2000 |
'a' est un type représenté comme ceci
Code :
|
Donc suivant les lettre de début ici, a, qui représente l'année d'entrée dans une société,
je déclare une variable x de type t_entrée ce qui donne après affectation :
Code :
|
Donc chaque 'champs' a son utilité et ne peut être associé à autre chose.
Note que les valeurs "01" ne sont pas identiques: l'une correspond au jour et l'autre au mois...
Il y a les entrées mais on peut facilement imaginer les départs 'b'
Code :
|
et le fichier ressembler à ça :
a 01 01 2000 |
Le plus rébarbatif ici c'est la phase de get et put qui est associé à chaques valeurs:
Code :
|
Et ainsi de suite pour chaque 'lignes' identifiées par une lettre. Ce n'est pas ma volonté mais une contraite de traitement...
C'est déjà pas mal pour le moment, si manque d'explication, dites le moi...
Ma question, est il possible une sorte de bocle get ou put plus 'propre' ?
Marsh Posté le 19-05-2006 à 22:06:37
apprentitux a écrit : Bon d'abord, il manque un new_line pour afficher ce que tu montres. |
Pourkoi un new_line ? le contenu du fichier s'affiche...
Marsh Posté le 24-05-2006 à 21:51:48
Bonsoir à tous,
Je me posais une question sur le package à utiliser pour manipuler un fichier en in_file avec des "character" à l'intérieur : sequential_io, direct_io ou simplement text_io ?
Je crois savoir que sequential_io et direct_io sont dans la catégorie binaire...
Marsh Posté le 24-05-2006 à 22:21:39
stupid_coder a écrit : Bonsoir à tous, |
Slaut stupid_coder,
une diference entre direct_io et sequential_io, c'est le faite que direct_io ouvre un fichier en acces direct et sequential_io en acces sequenciel.
une autre entre direct_io et sequential_io, ce sont les mode d'ouverture de fichier : in_file, out_file, append_file, pour sequential_io et text_io, et in_file, inout_file, et out_file pour direct_io,
un fichier text est lisible
les representation de direct_io, et sequential_io sont lessai a la discretion de (je sais plus qui)
edit : je corrige mes betises
Marsh Posté le 24-05-2006 à 23:08:03
Bonsoir Jovalise,
Merci de ta réponse.
Cependant j'utilise comme tu as pu le constater plus haut, un fichier en in_file uniquement pour extraire sont contenu et le garder en mémoire. Donc plusieurs packages me sont proposés...
Je te donne ci-dessous le bout de code qui me fait frémir en ce moment...
Code :
|
Marsh Posté le 24-05-2006 à 23:37:14
ben, wai, ben normal
edit j'delire
Marsh Posté le 24-05-2006 à 23:42:37
wai voila,
ça veut dire quoi
Code :
|
Marsh Posté le 25-05-2006 à 00:09:08
Les choses sérieuses commencent....
Je veux évaluer le premier caractère de la chaine.
Si c'est pas un 'I'... alors ligne suivante.
Mais...
str:string(1..80):
'I':character:
la relation str /= 'I' ne marche pas , car types différents...
Pourtant c'est comme une obligation de se tapper cette formulation:
"si le premier caractère de la ligne n'est pas une lettre majuscule, passer à la ligne suivante, ne touchez pas le 20 000 ..."
Il y a aussi un blème avec les "or", y comprends pas ma façon de voir les choses, c'est ambêtant...
Marsh Posté le 25-05-2006 à 00:32:54
Pas bon ça...
Code :
|
Il me dit que "non, ce soir tu te coucheras pas tôt, je te le promets..."
Code :
|
donc evident standard.string /= character type pour le coup, je le sais, le lis, le vois mais suis incapable de vous dire pourquoi !
j'essaie un str'image, str'value, je pense même qu'il me dit que je verrais même pas un bout de la couette là...
Marsh Posté le 25-05-2006 à 02:15:39
il y a encore 3 caracteres de trop
Code :
|
Marsh Posté le 27-05-2006 à 16:37:17
stupid_coder a écrit : Je veux évaluer le premier caractère de la chaine. |
Le type String en Ada est un tableau de caractères.
Tu veux comparer un tableau de caractères avec un caractère, tu vois pas comme un problème ??
Idem pour ta comparaison :
stupid_coder a écrit : if Str(1..1) /= 'I' then |
Tu compares un tableau de un caractère avec un caractère, du style : ['e'] = 'r'
Mon conseil sera donc le suivant :
Y a de très bons cours sur le net, donc étudies-les et arrêtes de poster ce genre de messages alors que le compilateur te donne des messages aussi explicites.
Ca se voit que tu débutes et on est tous passé par là, mais c'est pas te rendre service que de t'aider à compiler une simple affectation ou une comparaison de type primitifs..
stupid_coder a écrit : Il y a aussi un blème avec les "or", y comprends pas ma façon de voir les choses, c'est ambêtant... |
Non c'est vrai le compilateur ne comprends pas ta façon de voir les choses...
Il est vraiment mal fait ...
Reprogrammes-le.
Marsh Posté le 28-05-2006 à 23:43:09
apprentitux a écrit : |
Je me disais, tu as remarqué aussi...
Bon sérieux, voilà ce que j'ai qui me donne que du bonheur :
Code :
|
Je vais tester avec les caractères c,l,t,s et r et je vous dis si ça marche.
J'mets stupid_coder sur ma carte d'identité en tant que prénom si ça marche pas
Marsh Posté le 30-05-2006 à 17:27:56
Bonjour !
Bon je confirme ça fonctionne nickel ! j'ai eu chaud
petite précision sur les case:
y a t'il moyen de l'utiliser avec autre chose de des types discrets ?
Marsh Posté le 30-05-2006 à 20:57:38
Bonsoir
peut-etre as-tu déjàs repondu a ta question, mais la reponse est non
Marsh Posté le 31-05-2006 à 20:06:20
Bonjour Jovalise,
Donc si je veux extraires dans un fichier une ligne, pour l'utilisation d'un case, il ne faut pas rencontrer de float ?
Je vais peut être dire une anerie, mais pourquoi avoir la possibilité de faire un
Code :
|
et ne pas avoir d'équivalant en float ?
Marsh Posté le 31-05-2006 à 21:44:04
je vois pas le rapport avec le "case"
l'attribut image existe aussi pour les float, pour tous les scalaires en fait, donc les réels et les discrets
Marsh Posté le 01-06-2006 à 00:12:19
le case ait à priori utilisé uniquement avec les discrets...
Marsh Posté le 01-06-2006 à 09:28:56
ReplyMarsh Posté le 02-06-2006 à 12:24:22
Idem pour moi : je comprends rien à ce que dit stupid_codeur...
Et mec ! Arrètes les énigmes et essaye de t'exprimer clairement, on t'aidera plus vite parceque là, on dirait vraiment un dialogue de sourd!
Marsh Posté le 07-06-2006 à 10:57:48
J'm comprends c'est le principal et le projet est terminé.
Merci pour votre aide.
Marsh Posté le 07-06-2006 à 13:26:41
De rien, mais exprimes-toi mieux la prochaine fois ...
... De +, quand tu postes sur un forum, le principal n'est justement pas que tu te comprennes ... car ça peut servir à d'autres.
Marsh Posté le 08-06-2006 à 21:57:05
Humour au 8ème degrés apprentitux...
Il faut rebooter des fois !
Marsh Posté le 09-06-2006 à 10:01:07
Non, moi je rigole jamais
Marsh Posté le 16-05-2006 à 18:23:33
"Actuellement j'essaie de lire un fichier pour récupérer son contenu, en Out tel que l'écran standard pour commencer."
Plus précisément j'essaie de lire le fichier, identifier les caractères ou mots (c'est une chaine de caractères ou 'string' ) (<lettre>['_'][<chiffre>] en bnf) lus dans le fichier pour les extraires en sortie standard, par l'exemple :
admettons un fichier 'toto.txt' avec les lignes suivantes =>
--debut du fichier 'toto.txt'
ligne 1
ligne 2
ligne 3
-- fin du fichier 'toto.txt'
le résultat devrait me donner dans une sortie standard tel que l'écran:
ligne 1
ligne 2
ligne 3
Mais comme tu l'as remarqué je ne déclare peut être pas ce qu'il faut au bon endroit, on est le stupid_coder ou on ne l'est pas, ce n'est pas un choix mais une réalité....
Bref, je me demandais si je n'avais pas oublié des déclarations dans le type, ou mauvais type au mauvais endroit.
Aussi, j'ai tenté en vain de trouver une solution qui puisse prendre directement le nombre de caractères sur une ligne pour ensuite la récupérer dans l'extraction, en vue de la contenir dans un tableau pour plus tard:
exemple:
extrait du cours de génie logiciel de Daniel Feneuille, qui soulève le problème de connaitre le nombre de caractères d'une chaîne :
Je cite: " Comment affecter une chaîne à une autre chaîne si on ne connait pas sa longueur ?
[...] soit l'expression : t_jour'image(jour) [...]. Ce résultat ne porte pas en lui sa longueur ! Comment affecter cette chaîne à un evariable CHAINE_QUELCONQUE de typt T_STR sans savoir le nombre de caractères ?
long_chaine := t_jour'image(jour)'length;-- récupère la taille du STRING
CHAINE_QUELCONQUE(1..long_chaine):=t_jour'image(jour); --vraie affectation "
Pour le manque de précision je vous invite à lire le cours n°4 "Les STRING" à l'adresse suivante:
https://libre2.adacore.com/french_courses/
Et bien c'est une jolie formule mais j'ai un peu de mal là.
long_chaine récupère la taille de l'image de jour, pourquoi l'attribut image ?
"IMAGE permet de convertir un symbole de type énumératif en la chaîne
de caractères associée".
Dois-je faire de même pour le fichier, convertir les symboles en caractères associés ?
Message édité par stupid_coder le 17-05-2006 à 00:38:47
---------------
...pour les miracles ? prévoir un délai !