IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ada Discussion :

Lire sur l'entrée standard (Text_Io) jusqu'à la fin du fichier


Sujet :

Ada

  1. #1
    Invité
    Invité(e)
    Par défaut Lire sur l'entrée standard (Text_Io) jusqu'à la fin du fichier
    Bonjour,

    je souhaite lire du texte sur l'entrée standard jusqu'à la fin du fichier, c''est à dire à la frappe de Ctrl+d

    Je suis sur une machiine Gnu/Linux Sarge, je charche donc dans un premier temps, une solution pour cette plate-forme, mais j'espère porter le programme sur Windows.

    Mon problème est que le programme termine prématurément.

    Je voudrais savoir quelle sont les précaution à prendre éventuellement .... Un solution en tout cas, si c'est possible.


    Mon code est le suivant ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    With Text_Io; 
     
     use Text_Io;
     
    procédure Main is
     
       Char : Character;
    begin
     
       while not End_Of_File loop
     
          Get_Immediate(Char);
     
          -- Traitement du caractère.
     
       end loop;
     
    end Main;

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    Qu'entends-tu par se terminer prématurement ?

    Sinon au lieu de tester End_Of_File, teste peut-être le "character" EOF.

    Ou alors, tu testes trop tôt le End_Of_File (un fichier vide = End_Of_File); essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    loop
    Get_Immediate(char);
     
    exit when End_Of_File; -- ou alors : Char = EOF
    end loop;
    Ps : n'oublie pas quand le pb est résolu

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Merci Lowelace.

    J'ai essayer déjà de lire avant de tester la fin du fichier.

    Pour le caractère EOF, je suis bien content que tu m'en reparle,
    depuis tout petit, j'attend de savoir, comment il se ce code.

    C'est quoi le caractère EOF ?

    Mon problème, je crois, que c'est de faire ça dans une tache

    Qu'entends-tu par se terminer prématurement ?
    L'algo exacte, ... Alors, que j'attends un caractère infiniment ....

    Il en prend un, puis entrée, puis un second, puis termine.


    (je pofine ma liste générique)

  4. #4
    Invité
    Invité(e)
    Par défaut
    J'attend un caractère jusqu'à Ctrl+d (End of Transmmition ou en core le code ascii 4)... et pas infiniment

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    J'ai pas trop d'idées en stock : pas très familier avec les tâches Ada et les IO.

    Pour EOF, j'ai été "enduit" d'erreur par la RT Gnat (Interfaces.C_Streams), qui définit un EOF qui n'est pas un caractère ASCII.

    Essaie voir sur un petit exe avec le code que je t'ai suggéré et en testant le char vis-à-vis de EOT.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    J'ai pas trop d'idées en stock : pas très familier avec les tâches Ada et les IO.

    Pour EOF, j'ai été "enduit" d'erreur par la RT Gnat (Interfaces.C_Streams), qui définit un EOF qui n'est pas un caractère ASCII.

    Essaie voir sur un petit exe avec le code que je t'ai suggéré et en testant le char vis-à-vis de EOT.
    Bonjour,

    l'algo avec le teste de fin de fichier après le get_immediate ne change rien ..

    j'ai fait une petite erreur dans ma description ci-dessus ... le programme attend d'abord le caractere Entrée puis se déroule normalement.

    En revanche ... je n'avais pas remarqué ... puisque je m'attendais normalement à la fin du programme lors de la fin du fichier ... que EOT provoque la fin du programme... je ne sais comment ça ce fait par contre

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Mon objectif en fait c'est de pourvoir fair "cat fichier.txt | mon_prog" et lire le text sur l'entré stadard.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    "cat fichier.txt | mon_prog" et lire le text sur l'entré stadard.


    En résumé, quel est le comportement attendu ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lowelace Voir le message


    En résumé, quel est le comportement attendu ?
    J'attends que mon programme soit appelé en lui passant des données en sortie standard sur l'entrée standard (le pipe) et que celui-ci lise sur l'entrée standard jusqu'à la fin du fichier, puis s'exécute normalement.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Pourquoi veux-tu faire cela ?

    Pourquoi ne pas passer ton fichier en argument de ton exe (Comme en C ou en shell) puis de le lire dans ton exe ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    Pourquoi veux-tu faire cela ?

    Pourquoi ne pas passer ton fichier en argument de ton exe (Comme en C ou en shell) puis de le lire dans ton exe ?
    Pour des raisons de souplesse d'utilisation.

    C'est plu facile de pourvoir écrire

    mon_programme --input_file="les_données.txt" | mon_programme --ouput_file="le_résultat.txt"

    que

    touch fichier_temp
    mon_programme --input_file="les données.txt" -- output="fichier_temp" && mon_programme input="fichier_temp" --ouput_file="le_résultat.txt"

    la souplesse quoi

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Et si tu essayais d'utiliser le fichier Standard_Input défini dans Text_io comme un fichier normal ? (open , read while not End_of_file, Close )

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    Et si tu essayais d'utiliser le fichier Standard_Input défini dans Text_io comme un fichier normal ? (open , read while not End_of_file, Close )
    Euh oui, c'est pas bête ... cependant, Standard_Input n'est pas une variable.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Certes,mais c'est une fonction qui retourne un handler de fichier (File_Type).

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    Certes,mais c'est une fonction qui retourne un handler de fichier (File_Type).
    Et ... ou veux-tu en venir ?

  16. #16
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Bonjour,
    Voici un xemple pour copier un fichier texte (si ca peut t'aider) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    With Text_Io; 
     
     use Text_Io;
     
    procédure Main is
           original,copie: File_Type;
          temp : Character;
       begin
          open(original,In_File,"fichierEntree.txt");
          create(copie,Out_File,"fichierSortie.txt");
          while not End_Of_File(original) loop
             Get(original,temp);   
             Put(copie,temp);
          end loop;
          close(original);
          close(copie);
    end Main;
    Le End_Of_File utilise un paramètre, sans ce dernier ça ne marchait pas chez moi : le fichier n'etait pas recopié.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Merci pour l'exemple.

    Si tu set_input avec ton fichier, alors current_input sera ton fichier et tu dois pouvoir te passer de donner le fichier à end_of_file.

    Si je ne m'abuse.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Ah oui, tu as raison Orni-Dev, ... ça fonctionne beaucoup mieu en passant "Current_Input". Je n'avais pas remarqué encore.

    C'est louche au passage ... Il faudra que je vérifi sur Microsoft

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bon, mais ça règle pas mon problème.

    Mon code pour le moment est celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    with Computer, Text_Io;
     use Computer, Text_Io;
    procedure Main is
       Char : Character;
    begin
       while not End_Of_File(Current_Input) Loop
          Get_Immediate(Char);
          case Char is
             when Character'Val(0) =>
                exit;
             when others =>
                Console.Receive(Char);
          end case;
       end loop;
       Console.Shutdown;
     
    end Main;
    Donc là, si je fait "cat fichier.txt | mon_prog" ça exit bien en fin de fichier.
    Mais si j'appelle simplement "mon_prog" ... ça saisi pas.

    si je fait une simple boucle, avec le "cat fichier | ... " ça exit pas. par contre en appelant "mon_prog" ça saisi .. évidemment.

    Il doit y avoir une astuce ... c'est pas possible autrement.

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    je pense peut-être que tu essaies de lire dans deux "fichiers" différents :
    - sur la console,
    - sur l'entrée standard de ton appli.

    Peut-être, faut-il tester celui qui est non-vide et lire en fonction.

Discussions similaires

  1. Problème entrée standard sur un programme
    Par Sharpounet dans le forum Débuter
    Réponses: 4
    Dernier message: 06/07/2009, 11h16
  2. Réponses: 19
    Dernier message: 22/11/2008, 13h50
  3. Réponses: 2
    Dernier message: 13/06/2008, 19h15
  4. comment lire les arguments sur l'entree standard
    Par batotoba dans le forum ANT
    Réponses: 1
    Dernier message: 04/09/2006, 17h50
  5. Récupérer une adresse MAC sur l'entrée standard
    Par the_ionic dans le forum Réseau
    Réponses: 14
    Dernier message: 20/07/2006, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo