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 Pascal Discussion :

[LG]Compter des Lignes...


Sujet :

Langage Pascal

  1. #1
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 842
    Points
    4 842
    Par défaut [LG]Compter des Lignes...
    Bonjour,
    Je sais que ça peut ne pas paraître très passionnant de prime abord, mais ça peut quand même s'avérer très utile, et ce n'est pas si simple que ça à réaliser.

    En fait, ce que je voudrais faire, c'est compter le nombre de lignes qu'il y a dans un fichier quelconque.

    J'avais bien pensé à ç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
     
    procedure CptLgn(var F : text; var nb : integer);
    var i:integer;
        ligne:string;
    begin
    i:=0;
    readln(F,ligne);
    while ligne <> '' do
          begin
               inc(i);
               readln(F,ligne);
          end;
    nb:=i;
    end;
    Mais le problème est que le programme s'arrête de compter à la première ligne "vide".

    A vrai dire, je crois que c'est une impasse, car je ne vois pas comment faire autrement, mais c'est justement pour ça que je poste !

    Alors, si vous savez comment faire, ou si vous croyez avoir une piste, merci de me le signaler.

  2. #2
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    presque bon remplace le
    While ligne<>'' do
    par
    While not eof(F) do

    Bon courage

  3. #3
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Plusieurs éléments à prendre en compte.

    D'une part, le pointeur du fichier doit se trouver au début du fichier pour être sûr de ne louper aucune ligne.

    Ensuite, la fin d'un fichier est indiqué par la fonction Eof(var f).

    On pourrait donc avoir un truc dans le genre :

    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
     
    var
      f: Text;
      LineCount: Integer;
    begin
    LineCount := 0;
    {$I-}
    Assign(f, 'FICHIER.TXT');
    Reset(f); { Remise du pointeur du fichier à zéro }
    while (IOResult = 0) and not Eof(f) do
      begin
      ReadLn(f, S);
      Inc(LineCount);
      end;
    Close(f);
    {$I+}
    A+

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 842
    Points
    4 842
    Par défaut
    Merci, ça fonctionne (enfin, ça ne doit pas vous surprendre plus que ça, vu que vous aviez l'air de savoir ce que vous faisiez).

    Il y a quand même une chose étrange, pas dérangeante, mais juste étrange, c'est que si le fichier contient une (et une seule) ligne vide à la fin, elle n'est pas comptée.

  5. #5
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Normalement, elle doit être comptée.

    Seulement voilà, es-tu sûr de la présence de cette ligne vide finale ? Car souvent, les éditeurs de texte n'écrivent pas dans un fichier une ligne vide finale.

    C'est par exemple le cas pour l'IDE de Turbo Pascal.

    Pour t'assurer de l'existance de cette ligne, ouvre ton fichier texte avec un éditeur hexadécimal : le fichier doit se terminer par 0D 0A 0D 0A, autrement dit deux marqueurs de passage à la ligne (le premier pour l'avant dernière ligne, le dernier pour la dernière ligne)

    A+

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 97
    Points : 84
    Points
    84
    Par défaut Repeat..until
    Et si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If (IOResult = 0) Then
    Begin
      Repeat
        ReadLn(f,S);
        Inc(LineCount);
      Until (Eof(f));
    End;
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (IOResult = 0) and not Eof(f) do
    begin
      ReadLn(f, S);
      Inc(LineCount);
    end;
    Ca te compte ta ligne finale ?

  7. #7
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Le code que tu proposes the_clansman plante sur un fichier vide, car tu tente de lire au moins une ligne avec la boucle repeat là où il n'y en a peut-être même pas une.

    Il faut toujours travailler avec une boucle while pour les fichiers pour prévoir justement l'éventualité d'un fichier vide.

    A+

  8. #8
    Inactif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 97
    Points : 84
    Points
    84
    Par défaut
    Le code que tu proposes the_clansman plante sur un fichier vide, car tu tente de lire au moins une ligne avec la boucle repeat là où il n'y en a peut-être même pas une.

    Il faut toujours travailler avec une boucle while pour les fichiers pour prévoir justement l'éventualité d'un fichier vide.

    A+
    Très bien vu mon cher Hdd34...mais sous Delphi7, ça ne plante pas...et j'en suis le premier surpris

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

Discussions similaires

  1. [XSLT] compter des lignes / 2 colonnes
    Par lecelte dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 29/09/2009, 16h13
  2. script pour compter des lignes de codes
    Par zg2pro dans le forum Linux
    Réponses: 6
    Dernier message: 08/12/2007, 14h14
  3. compter des lignes \n dans un texrarea
    Par gforce dans le forum Général JavaScript
    Réponses: 56
    Dernier message: 19/01/2007, 15h44
  4. Compter des lignes perl ou bash
    Par Krispy dans le forum Linux
    Réponses: 4
    Dernier message: 12/12/2006, 17h28
  5. Compter des lignes
    Par HULK dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/05/2005, 10h20

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