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 :

Ré-écriture d'un fichier en entier


Sujet :

Ada

  1. #1
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut Ré-écriture d'un fichier en entier
    Bonjour ,

    Tout est dans le titre du sujet .

    Le code compile puis crash a l'éxécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    raised ADA.IO_EXCEPTIONS.END_ERROR : a-tigeli.adb:96

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    with Ada.Text_IO.Unbounded_IO ; use Ada.Text_IO.Unbounded_IO ;
    with Ada.Strings.Unbounded ;    use Ada.Strings.Unbounded ;
    with Ada.Text_IO ;              use Ada.Text_IO ;
     
    Procedure main is
     
      this_file : File_Type ;
     
      next_line : Positive_Count := 1 ;
     
      Type T_Tableau is array(1..1_000) of unbounded_string ;
     
      phrases : T_Tableau ;
     
     
    Begin
     
         Open
         (Mode => In_file ,
          File => this_file ,
          Name => "main.adb" ) ;
     
     
       loop
            exit when End_Of_File ( this_file ) ;
     
          Set_Line ( this_file , next_line );
     
            if next_line > 1 then
     
                for i in 1 .. 1_000 loop
                    phrases(i) := get_line ( this_file ) ;
                end loop ;
     
            end if ;
     
          next_line := next_line + 1 ;
     
       end loop ;
     
        Close ( this_file ) ;
     
         Open
         (Mode => Out_file ,
          File => this_file ,
          Name => "main.adb" ) ;
     
        for i in 1..1_000 loop
          put ( this_file , phrases(i) ) ;
       end loop ;
     
     
         Close ( this_file ) ;
     
    end main ;

  2. #2
    Membre actif

    Homme Profil pro
    Mathématicien et développeur
    Inscrit en
    Mars 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Mathématicien et développeur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 132
    Points : 241
    Points
    241
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par codezero1 Voir le message
    Le code compile puis crash a l'éxécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    raised ADA.IO_EXCEPTIONS.END_ERROR : a-tigeli.adb:96
    Ce message signifie que ton programme essayait de lire quelque chose alors qu'il était déjà arrivé au bout du fichier.
    Pour ta défense, le message n'est pas d'une clarté limpide quant au point ça plante.
    La "run-time library" (Ada.Text_IO, etc.) du compilateur en question est presque entièrement en Ada, donc on obtient souvent un message comme celui-là (ça a planté à la ligne 96 de a-tigeli.adb) => information complètement inutile.

    Si j'ajoute en haut de main.adb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with GNAT.Traceback.Symbolic, Ada.Exceptions;
    et en bas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    exception
      when E: others =>
        New_Line;
        Put_Line("--------------------[ Unhandled exception ]-----------------");
        Put_Line(" > Name of exception . . . . .: " &
                 Ada.Exceptions.Exception_Name(E) );
        Put_Line(" > Message for exception . . .: " &
                 Ada.Exceptions.Exception_Message(E) );
        Put_Line(" > Trace-back of call stack: " );
        Put_Line( GNAT.Traceback.Symbolic.Symbolic_Traceback(E) );
    end main ;
    et en compilant avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gnatmake -g main -bargs -E
    (évident, n'est-ce pas ? )

    j'obtiens ce message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --------------------[ Unhandled exception ]-----------------
     > Name of exception . . . . .: ADA.IO_EXCEPTIONS.END_ERROR
     > Message for exception . . .: a-tigeli.adb:96
     > Trace-back of call stack:
    [X:\main.exe]
    0x0040D5DF  at ???
    0x004107DE  at ???
    0x0040BC05  at ???
    0x00401C0C main at main.adb:34
    0x004019E9 main at b~main.adb:255
    0x004013DB .tmainCRTStartup at crtexe.c:332
    En l'occurrence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                for i in 1 .. 1_000 loop
                    phrases(i) := get_line ( this_file ) ;  <<<< Ici !
                end loop ;
    Et en effet, ce END_ERROR doit arriver puisque main.adb fait moins de 1000 lignes!...

  3. #3
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par Zerte Voir le message
    Et en effet, ce END_ERROR doit arriver puisque main.adb fait moins de 1000 lignes!...
    Bonjour Zerte ,

    Ton astuce pour afficher l'erreur n'indique toujours pas où elle se trouve dans le code .

    De plus l'erreur persiste même si je spécifie le nombre exacte de lignes .

    Bref , tu m'a perdu

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    with Ada.Text_IO.Unbounded_IO ;	use Ada.Text_IO.Unbounded_IO ;
    with Ada.Strings.Unbounded ;	use Ada.Strings.Unbounded ;
    with Ada.Text_IO ;				use Ada.Text_IO ;
     
    Procedure main is
     
      this_file : File_Type ;
     
      next_line : Positive_Count := 1 ;
     
      Type T_Tableau is array(1..55) of unbounded_string ;
     
      phrases : T_Tableau ;
     
     
    Begin
     
    	 Open
         (Mode => In_file ,
          File => this_file ,
          Name => "main.adb" ) ;
     
     
       loop
    		exit when End_Of_File ( this_file ) ;
     
    	  Set_Line ( this_file , next_line );
     
            if next_line > 1 then
     
                for i in 1 .. 55 loop
                    phrases(i) := get_line ( this_file ) ;
                end loop ;
     
            end if ;
     
          next_line := next_line + 1 ;
     
       end loop ;
     
        Close ( this_file ) ;
     
         Open
         (Mode => Out_file ,
          File => this_file ,
          Name => "main.adb" ) ;
     
        for i in 1..55 loop
          put ( this_file , phrases(i) ) ;
       end loop ;
     
     
         Close ( this_file ) ;
     
    end main ;

  4. #4
    Membre actif

    Homme Profil pro
    Mathématicien et développeur
    Inscrit en
    Mars 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Mathématicien et développeur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 132
    Points : 241
    Points
    241
    Billets dans le blog
    3
    Par défaut
    Un peu d'élagage pourra t'aider.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       loop
            exit when End_Of_File ( this_file ) ;
    se simplifie en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       while not End_Of_File ( this_file ) loop
    Tu peux joyeusement enlever ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          Set_Line ( this_file , next_line );
    Le test
    est inutile, tu peux l'enlever.

    Il reste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       while not End_Of_File ( this_file ) loop
     
          for i in 1 .. 55 loop
             phrases(i) := get_line ( this_file ) ;
          end loop ;
     
          next_line := next_line + 1 ;
     
       end loop ;
    Et là quelque chose pourrait bien te sauter aux yeux !...

  5. #5
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    je remarque que : - next_line ne sert plus à rien .

    - une boucle imbriquée dans une autre , c'est pas terrible .

    Autre chose ?

  6. #6
    Membre actif

    Homme Profil pro
    Mathématicien et développeur
    Inscrit en
    Mars 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Mathématicien et développeur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 132
    Points : 241
    Points
    241
    Billets dans le blog
    3
    Par défaut
    Par exemple: à quoi sert la boucle intérieure ?

  7. #7
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    Au départ , la boucle intérieure devait servir à prendre chaque ligne du fichier dans une case du tableau .

    Ensuite la derniére boucle , met le contenu de chaque case du tableau , dans le fichier , pour le ré-écrire complétement .

  8. #8
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    J'ai réussi .

    Exécutez le programme , ensuite :

    Pour ceux qui ont pas compris , ouvrez le fichier "verify" , dans l'endroit où vous avez enregistrer le fichier main .

    Vous constatez donc que le fichier à été entiérement copié-collé string par string .

  9. #9
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut raised CONSTRAINT_ERROR : main.adb:24 index check failed
    Malgrés le message , on ne sait pas pourquoi ça ne fonctionne pas :
    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
    37
    WITH Ada.Text_IO ;              USE Ada.Text_IO ;
    WITH Ada.Text_IO.Unbounded_IO ;	USE Ada.Text_IO.Unbounded_IO ;
    WITH Ada.Strings.Unbounded ;	USE Ada.Strings.Unbounded ;
     
    Procedure main is
     
      limit : Long_Integer := 1 ;
     
      Type T_Tableau is array ( Long_Integer range 1 .. limit) of unbounded_string ;
     
      case_of_array : T_Tableau ;
     
      this_file : File_type ;
     
    Begin
     
    	Open
         (File => this_file ,
          Mode => In_file ,
          Name => "main.adb");
     
       loop exit when End_Of_File ( this_file ) ;
     
    	 case_of_array ( limit ) := Get_Line( this_file );
     
         limit := limit + 1 ;
     
       end loop ;
     
        Reset  ( this_file , Out_file ) ;
     
        for i in 1 .. limit loop
         Put_line( this_file , case_of_array( i ) ) ;
       end loop ;
     
       put( Positive'Image (case_of_array'Length) ) ;
    End main ;

  10. #10
    Inactif
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2016
    Messages : 22
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    ce qui irait bien ici c'est un range <> dans la contrainte du tableau.
    Ou alors, ajouter un exit when limit = 1 dans la boucle de lecture.

Discussions similaires

  1. problème écriture sur un fichier
    Par drinkmilk dans le forum MFC
    Réponses: 4
    Dernier message: 24/06/2007, 00h08
  2. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  3. Passer à la ligne lors de l'écriture dans un fichier
    Par hams dans le forum Assembleur
    Réponses: 4
    Dernier message: 17/04/2005, 19h25
  4. [JUnit] Junit écriture dans un fichier
    Par mikael35 dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 10/08/2004, 13h11
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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