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]Lecture de fichier


Sujet :

Langage Pascal

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut [LG]Lecture de fichier
    Bonjour,

    J'ai un souci pour rechercher dans un fichier texte des données. J'utilise Turbo Pascal et une librairie qui propose une fonction qui n'est pas vraiment faite pour cela. Je pense donc qu'il vaut mieux simplement utiliser les fonctions standards du Pascal, mais j'ai un problème lorsque j'appelle la fonction "ReadLn" :

    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
     
    ...
    var zone,line,codedirect,temp:string;
    var nbreg:longint;
    var status:byte;
    var filecar:file of byte;
    ...
     
    if ioresult <> 0 then ERREUR:=1 else ERREUR:=0;
     
    if ERREUR = 0 then
       begin
     
       while (not eof(filecar)) and (((zonestr<>zone) OR  (codedirectstr<>codedirect))) do 
            begin 
                ReadLn(filecar, zone); 
                ReadLn(filecar, codedirect);
            end;
    ...
    La structure du fichier se présente ainsi :

    champ1;champ2;

    Voilà, merci d'avance pour toute info.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Il faut déclarer ton fichier comme text (et non file of byte).

    Comme tes deux zones sont sur la même ligne, il ne faut faire qu'une seule lecture de la ligne entière puis utiliser les fonctions de gestion de chaînes de caractères pour détecter les deux zones (par exemple, la fonction Pos() pour repérer les points-virgules).
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Les données sont-elles stockées sous cette forme :
    Séparées par des points-virgules ? Si oui, tu n'utilises pas la bonne méthode, car tu tentes de lire des bytes dans un fichier contenant du texte... Tu utilises pourtant un fichier file of byte, ce qui n'est pas très logique en vérité...
    Il te faut déterminer comment tu vas accéder aux données contenues dans le fichier. Si ton fichier est encodé en texte clair, tu utiliseras une variable de type text, au contraire si ton fichier est encodé sous forme bianire, tu pourras utiliser un fichier file of byte.
    Si les données sont effectivement codées par "cahmp1;champ2;", elles se trouvent en mode texte. Dans ce cas, il faut que tu revoies ta procédure de lecture du fichier, car tu ne pourras pas utiliser le type de fichier file of byte.
    Pour lire les données à partir d'un fichier text, tu as plusieurs possibilités :
    - soit lire ligne par ligne puis traiter chaque ligne en séparant les champs et les ';'
    - soit lire caractère par caractère, ce qui est plus fastidieux, mais parfois plus efficace dans le cas de fichier mal formés...
    Tu as donc le choix, mais je pense que tu pourras adapter ton bout de programme à l'utilisation que tu veux en faire ! N'hésite pas à venir nous voir, si tu as un problème

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Ne connaissant pas bien Pascal, j'ai besoin d'exemple.
    En fait, le mieux, je pense en terme de temps de performance, est de charger le fichier dans un tableau mémoire et de travailler avec ce tableau ensuite ?

    Mon fichier est en effet bien un fichier texte dont les enregistrements sont du type : "champ1;champ2;".
    L'idéal serait de récupérer les champs et de les mettre dans un tableau à 2 dimensions, puis de faire une recherche de l'enregistrement pour lequel on a : "champ1cherche=champ1" et "champ2cherche=champ2".

    Voilà merci pour vos suggestions.

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Si ton fichier n'est pas trop gros en taille, un tableau peut suffir, mais si ton fichier est volumineux (dont la taille avoisinne 64Ko environ, si on exclut les ';' et les CRLF). Si ton fichier dépasse cette taille, il te faudra passer par une liste chaînée ou un autre moyen de stockage plus important...

    Pour les exemples, je te conseille tout d'abord de jeter un oeil aux exercices corrigés car ils renferment beaucoup de sources importantes. Une fois que tu auras lu ton fichier ligne par ligne, (ou caractères par caractères mais dans ton cas ce n'est peut-être pas l'idéal), il te faudras séparer les champs des ';'. Pour celà, comme l'a dit Alcatîz, tu peux utiliser les fonctions pos et copy...

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    En terme de performance, je pense qu'il serait plutôt préférable de faire le test de recherche d'enregistrement au fur et à mesure de la lecture du fichier.
    Car si j'interprète bien le code de ton premier post, tu arrêtes la recherche dès que tu as trouvé le bon enregistrement.

    Ainsi, en effectuant le test au fur et à mesure de la lecture, tu n'es pas obligé de lire tout le fichier (opération qui prend le plus de temps).

    A ta place, je ferais comme ceci (code non testé) :
    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
    Var Buffer : String;
        Trouve : Boolean;
        Zone, Codedirect : String;
        FileCar : Text;
        Index : Byte;
     
       ...
       Trouve := False;
       while (not EOF(FileCar)) and not Trouve do
         begin
           ReadLn(FileCar, Buffer);
           Index := Pos(';',Buffer);
           Zone := Copy(Buffer,1,Index - 1);
           CodeDirect := Copy(Buffer,Index + 1,Length(Buffer) - Index - 1);
           Trouve := (Zone = ZoneStr) and (CodeDirect = CodeDirectStr);
         end;
      Close(FileCar);
      if Trouve
         then
            ...
    [edit]Désolé, wormful, nous avons posté en même temps[/edit]
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Merci Alcatîz, ta méthode est beaucoup plus performante, ça fonctionne beaucoup mieux ainsi !

    A+

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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