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 :

[ADA] Lire les colonnes d'un fichier


Sujet :

Ada

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [ADA] Lire les colonnes d'un fichier
    Bonjour à tous,

    Je débute en ADA mais on m’a lancé professionnellement sur un code très lourd écrit dans ce langage. Je vous présente mon problème.
    Disons qu'il existe un fichier (.txt) qui a cette tête-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Titre BlaBla
    Sous-titre Blibli
    1.0      -3.154      -1.26
    5.0      2.1456      -1.56
    8.0      1.256       1.258
    Apparemment, je peux écrire :

    NOTA :
    - "FILE" est mon fichier .txt
    - ALTI, VAR_1 et VAR_2 sont bien définis comme des Long_Float

    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
    (...)
    TEXT_IO.OPEN ( FILE,TEXT_IO.IN_FILE );
    
    TEXT_IO.GET_LINE(FILE,TITRE,0); #Pour écrire la première ligne du fichier dans "TITRE"
    TEXT_IO.GET_LINE(FILE,SOUS_TITRE,0); #Pour écrire la 2nde ligne du fichier dans "SOUS-TITRE"
    
    TEXT_IO.PUT_LINE(TITRE); #Je vérifie que mon code affiche bien "Titre BlaBla"
    TEXT_IO.PUT_LINE(SOUS_TITRE);  #Je vérifie que mon code affiche bien "Sous-titre Blibli"
    TEXT_IO.PUT_LINE ("1 ok  "); #Je vérifie que mon code va au moins jusque-là
    LONG_FLOAT_TEXT_IO.GET ( FILE, ALTI);
    TEXT_IO.PUT_LINE ("2 ok  ");
    LONG_FLOAT_TEXT_IO.GET ( FILE, VAR_1);
    TEXT_IO.PUT_LINE ("3 ok  ");
    LONG_FLOAT_TEXT_IO.GET ( FILE, VAR_2 );
    TEXT_IO.PUT_LINE ("4 ok  ");
    
    (...)
    Bref, la compilation se passe bien (on a les moyens de vérifier ça).
    Par contre, lors de l’exécution, tout se déroule bien pour l’affichage du titre, puis du sous-titre de mon fichier.
    J’affiche ensuite « 1 ok » et… c’est tout !
    Vraisemblablement, j’ai un souci avec la ligne 10 (du code ci-dessus) qui me fait sortir de mon programme.

    J’ai pensé à plusieurs chose mais ma première question est : pensez que mon fichier .txt doit avoir un format particulier à partir de la 3ème ligne (séparation par 1/plusieurs espace ; par des tabulations…) ?
    Un problème d’encodage (UTF-8 normalement…) ?

    Un grand merci pour votre patience, votre aide...

  2. #2
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Je débute en ADA mais on m’a lancé professionnellement sur un code très lourd écrit dans ce langage.
    Bosserais-tu dans une SSII qui t'a vendu comme "expert" ?
    Trève de plaisanterie, pas de panique, ça va bien se passer. En Ada, il se passe rarement des trucs incroyables ou non prévus.

    Bref, la compilation se passe bien (on a les moyens de vérifier ça).
    Par contre, lors de l’exécution, tout se déroule bien pour l’affichage du titre, puis du sous-titre de mon fichier.
    J’affiche ensuite « 1 ok » et… c’est tout !
    Jusque là, ça ne me choque pas, c'était facile

    Vraisemblablement, j’ai un souci avec la ligne 10 (du code ci-dessus) qui me fait sortir de mon programme.
    Effectivement, cela semble probable. Le problème est que l'on n'a qu'un fragment du code.
    Y a-t-il un gestionnaire d'exception qui te cacherait ce qu'il se passe ?
    D'après la bible, il se pourrait que tu te prennes une Data_Error.
    En l'état, je ne vois rien de choquant dans le code mais bon, il est tard

    Je te conseille donc de t'écrire un petit code permettant de lire le dit-fichier tout en inspirant très fortement du code que l'on te fournit.
    Cela te permettra de le triturer dans tous les sens sans risque pour le reste.

    Ceci dit, de l'UTF-8 pour un fichier ne contenant que des valeurs numériques simples me semble inutile et effectivement source de problèmes potentiels.

  3. #3
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Bon, ça marche avec ça
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    with Ada.Text_Io; use Ada.Text_IO;
     
    procedure TestAlti is
       type Altitude is new Long_Float;
     
       Alti : Altitude;
       Var_1 : Altitude;
       Var_2 : Altitude;
     
       package Long_Float_Text_IO is new Ada.Text_IO.Float_IO(Altitude);
     
       FILE : Ada.Text_IO.File_Type;
       Titre : String(1..50);
       Sous_Titre : String(1..50);
       Last_Pos : Natural;
    begin
     
       OPEN ( FILE,IN_FILE, "altis.txt" );
     
       GET_LINE(FILE,TITRE,Last_Pos); -- Pour écrire la première ligne du fichier dans "TITRE"
       GET_LINE(FILE,SOUS_TITRE,Last_Pos); -- Pour écrire la 2nde ligne du fichier dans "SOUS-TITRE"
     
       PUT_LINE(TITRE); -- Je vérifie que mon code affiche bien "Titre BlaBla"
       PUT_LINE(SOUS_TITRE);  -- Je vérifie que mon code affiche bien "Sous-titre Blibli"
       PUT_LINE ("1 ok  "); -- Je vérifie que mon code va au moins jusque-là
       LONG_FLOAT_Text_IO.GET ( FILE, ALTI);
       Put_Line("Alti=" & Altitude'Image(Alti));
       PUT_LINE ("2 ok  ");
       LONG_FLOAT_Text_IO.GET ( FILE, VAR_1);
       Put_Line("Var_1=" & Altitude'Image(VAR_1));
       PUT_LINE ("3 ok  ");
       LONG_FLOAT_TEXT_IO.GET ( FILE, VAR_2 );
       Put_Line("Var_1=" & Altitude'Image(VAR_1));
       PUT_LINE ("4 ok  ");
       Close(FILE);
    end TestAlti;
    Par contre, tu utilises quoi comme compilateur ? En quelle version de la norme, 83, 95, 2005 ou 2012 ?
    Perso, ça ne compilait pas en l'état, le Get_Line sur les String me demandait que le dernier paramètre soit une variable.
    Autre remarque, mon fichier est en ASCII et n'est qu'un copier/coller de ce que tu nous as fourni.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ne désespère pas si je ne réponds pas immédiatement,

    Je regarde tout cela lundi au boulot.

    Un immense merci pour ta réponse rapide !!

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bon,

    Merci encore pour cette réponse.
    En fait je crois que le problème vient du fichier d'entrée.
    Mais les questions à se poser étant plus compliquées que ça, je vais regarder de mon coté.

    Merci encore !

    Edit :
    Oh..... Putain j'ai trouvé !

    En fait : la variable "SOUS_TITRE" est définie comme une chaine de caractère (ça c'est bon) ... de longeur 80 ! Et dans mes fichiers d'entrées, je dépasse cette longueur de sous-titre.

    Du coup je me pose une question, pourquoi
    - j'arrive à "lire" le sous-titre (puisqu'il s'affiche avec "TEXT_IO.PUT_LINE(SOUS_TITRE)"),
    - j'arrive à "passer" à l'étape suivante (puisqu'il affiche "1 ok ")
    - il plante à ce moment là...
    - et l'erreur se trouve dans la longueur de la variable "SOUS_TITRE"

    Bizare...

  6. #6
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    En fait, il n'y a rien d'anormal si tu regardes le fonctionnement de Get_Line dans l'ARM.
    En effet, la lecture s'arrête lorsque la fin de la ligne est atteinte OU quand la fin de ta chaîne est atteinte.
    Dans ton cas, la fin de chaîne étant atteinte, il reste des caractères à lire et donc ils sont lus au moment de ta récupération des LONG_FLOAT.
    Du coup, j'en reviens à ma première idée, tu devrais traiter les exceptions issus de la lecture.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/11/2011, 15h38
  2. Lire les lignes d'un fichier avec csh
    Par nicolas581 dans le forum Linux
    Réponses: 4
    Dernier message: 24/03/2010, 16h38
  3. Remplir les colonnes d'un fichier excel
    Par craryb dans le forum MFC
    Réponses: 3
    Dernier message: 14/03/2007, 12h37
  4. Lire les données d'un fichier .wav ?
    Par DelphLaga dans le forum Modules
    Réponses: 2
    Dernier message: 16/10/2006, 16h21
  5. Réponses: 5
    Dernier message: 20/08/2002, 18h01

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