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

Langage Perl Discussion :

[langage]detection fin fichier


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut [langage]detection fin fichier
    Bonjours
    J'ai un petit probleme.
    Voila mon code, enfin voila un code simplifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    open (FIC,"FIC.TXT")||die("pb d'ouverture\n");
    until($ligne=~/17 H 00/)
    {
    	$ligne=<FIC>;
    	if($ligne=~/toto/)
    	{
    		print $ligne;
    	}
    }
    Donc le programme va jusqu'a ce quil trouve 17 H 00 dans le fichier.
    Mais si jamais il le trouve pas, il bloque.
    Comment puis-je remedier a ce probleme.
    En gros est ce qu'il existe un test qui detecte la fin du fichier pour pouvoir arreter le programme?
    Merci

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: detection fin fichier
    Je n'ai pas testé, je fais de mémoire, mais comme ça, ça devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    open (FIC,"FIC.TXT")||die("pb d'ouverture\n");
    while (($ligne = <FIC>) and ($ligne!~/17 H 00/))
    {
    	if($ligne=~/toto/)
    	{
    		print $ligne;
    	}
    }
    Il te faut considérer la fin de fichier comme une condition d'arrêt absolument prioritaire ... on pourrait aussi écrire ça avec une rupture de séquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    open (FIC,"FIC.TXT")||die("pb d'ouverture\n");
    while ($ligne = <FIC>)
    {
    	last if ($ligne =~ /17 H 00/);
    	if($ligne=~/toto/)
    	{
    		print $ligne;
    	}
    }
    Bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Non, si on fait ainsi, le while teste juste si $ligne est vrai, ce qui peut ne pas être le cas si la ligne est vide, ou contient juste un 0... Soit on écrit seulement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while( <FIC> ) {
      last if /17 H 00/;
      print if /toto/;
    }
    Soit on explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while (defined($ligne = <FIC>) and ($ligne!~/17 H 00/))
    {
       if($ligne=~/toto/)
       {
          print $ligne;
       }
    }
    Car l'opérateur "<>" renvoit undef si on a atteint la fin du fichier.
    (Si il n'y a qu'un <TRUC> dans la condition du while, perl déduit tout seul qu'on veut en réalité mettre la condition : "defined( $_ = <TRUC> )" )

    --
    Jedaï

  4. #4
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par Jedai
    Non, si on fait ainsi, le while teste juste si $ligne est vrai, ce qui peut ne pas être le cas si la ligne est vide, ou contient juste un 0...
    Tu sais, j'ai fait la meme reflexion, et donc avant de poster j'ai fait un petit test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ perl -e 'print "1\n2\n0"' | perl -le 'while ($x=<>) {print "<$x>" }'
    <1
    >
    <2
    >
    <0>
    Donc ca marche quand meme. Je sais que c'etait un piege dans les grands temps anciens, mais apparament ca a ete corrige a un moment donne.

    Cela etant, je continuerai a ecrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while( defined( my $rec = <FIC> )) {
        ...
    }
    car j'aime bien expliciter ce que est en train de se passer.

    N

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [langage] [Fork] Détecter un fichier
    Par GLDavid dans le forum Langage
    Réponses: 11
    Dernier message: 08/07/2004, 01h05
  2. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08
  3. [langage] delete de fichier
    Par lolive dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2003, 15h04
  4. [langage] Comparaison de fichiers
    Par Jibees dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2003, 16h27
  5. Réponses: 2
    Dernier message: 26/02/2003, 15h18

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