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

Delphi Discussion :

Lecture d'un fichier


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Par défaut Lecture d'un fichier
    bonjour !

    ça fait longtemps que je n'ai pas touché à delphi et j'ai un probleme !

    j'ai une erreur d'entré/sortie mais je pense avoir bien fait attention à la fermeture de mes fichiers texte et avoir bien déclarer l'utilisation ( append/reset )

    voici mon code

    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
    if ((cat.ItemIndex = (-1)) and (key_word.Text <> '') and (sort.ItemIndex >= 0)) then
    begin
     assignfile(lib,'bd_mum.txt');
     reset(lib);
     while not eof(lib) do       //<------- l'erreur se trouve la apparement
      begin
       readln(lib, transfer);
       cut(transfer);
         if (temp[i] = key_word.text) then
          begin
           closefile(lib);
           assignfile(bil,'search.txt');
           append(bil);
           writeln(bil, transfer);
           closefile(bil);
          end;
        end;
     closefile(lib);
     assignfile(lib,'search.txt');
     reset(lib);
     form6.result.clear;
     while not eof(lib) do
      begin
       readln(lib, transfer);
       form6.result.AddItem(transfer,form6.result);
      end;
     closefile(lib);
     form6.Show();
    end;
    si vous pouvez m'aidez vous eriez géniaux...

    et surtout n'hésitez pas à me donner des conseils sur la façon de programmer...

  2. #2
    Membre très actif
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Par défaut Re :
    Peut etre que tu t'ai trompé de chemin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignfile(lib,'bd_mum.txt');

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Par défaut
    Ben pourtant nan le fichier ce trouve bien à la racine du prog...

    Je pense que c'est un problême avec les append et reset lors de l'écriture et de lecture du fichier mais tout me semble correct il doit bien y avoir un petit truc...

  4. #4
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    Salut,
    Je ne voudrais pas avoir l'air de dire une connerie mais là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while not eof(lib) do       //<------- l'erreur se trouve la apparement
      begin
       readln(lib, transfer);
       cut(transfer);
         if (temp[i] = key_word.text) then
          begin
           closefile(lib); <- là je suis pas sur que ça devrait être là ça ...
           assignfile(bil,'search.txt');
           append(bil);
           writeln(bil, transfer);
           closefile(bil);
          end;
        end;
    Si par hasard ton programme entre dans la condition If et bien à la fin de celle-ci ton fichier n'est plus en mode ouverture ... Une fois ta boucle If terminé, la boucle While reprenant le dessus le test de EoF(lib) ne peut pas marcher ....


    A plus

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut
    Il me semble pas que tu dise une bêtise ^_^ ça m'a sauté aux yeux aussi. Dès que la condition de ton "if" est vérifiée, tu ferme ton fichier mais ton continue à vouloir itérer dessus.

    Pour y remédier je vois, comme ca, 2 solutions.

    1) à la fin de ton if tu met un "Break" pour quitter l'exécution de la boucle.

    2) Tu ajoute une deuxième condition dans ton while avant le test du eof

    Au plaisir

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Par défaut
    merci pour vos réponses !

    mais... ça fait toujours la même... erreur entré/sortie

    alors je vous explique le délire... c'est un programme avec le défi de faire une base de donnée ( elle sera petite : une centaine d'entrée ) avec des fichiers textes. C'est un logiciel de bibliothèque. ce bout la de programme est l'endroit ou je fait une recherche dans mon fichier texte en ayant un nom et la catégorie 'auteur' selectionné dans une combobox ( vous le voyez avec le premier "if" ).

    mais le prob c'est que j'ai plein de ligne dans mon fichier alors je cherche à travers mon ficher ou il y a toutes les entrées et sur chaque ligne je sépare la chaine ( qui est sous la forme : auteur;titre;date;... ) et je le met dans un tableau temporaire ( la procédure cut que j'ai créer plus loin ) qui me permet de voir au niveau de l'auteur dans notre cas le nom qui apparait ( temp[1] c'est ou ce trouve le nom ) et si c'est bon je copie la ligne dans le fichier résultat ( "search.txt" ).

    en bref c'est ça... je sais si vous comprenez avec mon explication un peu flou..

    enfin j'ai besoin de continuer la lecture de mon fichier pour voir toutes les lignes.

    voici ma procédure cut :

    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
     
    procedure cut (s: string);
     
    var ss,ff: string;
        j: integer;
     
    begin
     
    while AnsiPos(';',s)<>0 do
    begin
    ss:=copy(s,1,AnsiPos(';',s));
    delete(s,1,AnsiPos(';',s));
    assignfile(bil,'temp.txt');
    rewrite(bil);
    closefile(bil);
    assignfile(lib,'temp.txt');
    append(lib);
    writeln(lib,ss);
    closefile(lib);
    end;
    j:=1;
    assignfile(lib,'temp.txt');
    reset(lib);
    while not eof(lib) do
    begin
    readln(lib,ff);
    temp[j]:=ff;
    end;
    closefile(lib);
    end;
    fiou... bon si la on peut m'aider vous êtes fort parce que mes expliquations sont pas au niveau...

    merci encore

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Et si t'avais mis un bout de ton fameux fichier, tu crois pas que ça aurait pu être utile à la compréhension du code qui est sensé le triturer, mmmh ?
    --
    jp

  8. #8
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    Le soucis en fait c'est que tu utilises la même variable globale pour dans une même procedure utiliser de fichier différents. Donc effectivement il faut fermer le fichier une première fois (mal placé d'ailleurs je crois) avant de lui assigner un autre fichier.
    Une alternative simple serait de créer une troisième variable dans ton programme de type Text (fichier texte quoi ...) et de te servire de cette variable dans la procédure Cut.

    Une autre possibilité (enfin je crois) serait de créer un type pointeur vers un fichier texte et d'utiliser ce pointeur => l'avantage est que logiquement ça consomme moins de ressource qu'une variable globale ... (a vérifier).

    Cela dit si je epux me permettre je pense qu'il y a une erreur dans ta procedure Cut (rajout en gras) :
    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
    procedure cut (s: string);
     
    var ss,ff: string;
        j: integer;
     
    begin
     
    while AnsiPos(';',s)<>0 do
    begin
    ss:=copy(s,1,AnsiPos(';',s));
    delete(s,1,AnsiPos(';',s));
    assignfile(bil,'temp.txt');
    rewrite(bil);
    closefile(bil);
    assignfile(lib,'temp.txt');
    append(lib);
    writeln(lib,ss);
    closefile(lib);
    end;
    j:=1;
    assignfile(lib,'temp.txt');
    reset(lib);
    while not eof(lib) do
    begin
    readln(lib,ff);
    temp[j]:=ff;
    inc(j); //sans ça tu écrases toujours la même case de ton tableau ... Enfin si j'ai bien compris ce que tu veux faire
    end;
    closefile(lib);
    end;
    Au final j'aurais un truc du style :
    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
    type TFichier = ^Text; //(je sais aps si ça c'est possible)
    ...
    var
    lib1 : TFichier;
    lib : Text;
    ...
    
    Procedure Cut(s:string);
    var ss,ff: string;
        j: integer;
    begin
    New(lib1);
    while AnsiPos(';',s)<>0 do
    begin
    ss:=copy(s,1,AnsiPos(';',s));
    delete(s,1,AnsiPos(';',s));
    assignfile(bil,'temp.txt');
    rewrite(bil);
    closefile(bil);
    assignfile(lib^,'temp.txt');
    append(lib^);
    writeln(lib^,ss);
    closefile(lib^);
    end;
    j:=1;
    assignfile(lib^,'temp.txt');
    reset(lib^);
    while not eof(lib^) do
    begin
    readln(lib^,ff);
    temp[j]:=ff;
    inc(j);
    end;
    closefile(lib^);
    Dispose(lib);
    end;
    
    //et ta procedure qui semble buger)
    while not eof(lib) do
      begin
       readln(lib, transfer);
       cut(transfer);
         if (temp[i] = key_word.text) then
          begin
           assignfile(bil,'search.txt');
           append(bil);
           writeln(bil, transfer);
           closefile(bil);
          end;
        end;
    closefile(lib);

    Ca c'est donc le code avec une var en pointeur ... je ne suis pas sur que ça puisse fonctionner (je ne sais pas si delphi accepte de pointer un type de fihcier ???) comme ça mais une alternative sur (mais plus gourmande en ressource ... de pas beaucoup on est d'accord) et de créer une nouvelle variable text lib1 et de t'en servir dans cut...

    Ceci partant du principe que j'ai compris ce que tu voualis faire ce qui n'est pas forcé


    A plus tard

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut
    Hummm.... pas évident de trouver l'erreur comme ca .. mais un truc est sur ... tu as un sushi sur les ouvertures et fermetures de tes fichiers. Expliqué comme ca, c'est vrai que je retire ce que j'ai dit il ne faut pas mettre de break à la fin de ton if.

    Par contre : Dans ton if, tu ne dois pas fermer ton fichier. Car vu que tu continue à le parcourir ca ne peut en tout cas pas marcher. Et meme si tu le réouvre, il sera revenu au debut dons tu risque fort d'avoir une boucle infinie car tu arrivera jamais à la fin du fichier.

    En plus : Dans ta procédure cut, tu refais un assignFile a ta variable lib. ca pose 2 problèmes : 1) à la sortie de ta fonction cut, ta variable lib pointera sur le fichier temp.txt. Sauf que dans ta procédure principale tu continue ta boucle While not eof(lib) comme si tu étais toujours sur ton fichier BD_mum.txt. 2) En plus de ca c'est pas très "élégant" d'utiliser une variable dans une procédure ou fonction sans la passer en paramètre. C'est la porte ouverte a des prises de tête car tu ne sais plus ou est modifiée ta variable.

    Au final je dirais : c'est pas un reproche, mais tu as l'air de t'embrouiller un peu dans l'association entre les variables et tes fichier ce qui donne des résultats un peu étrange. Je te conseil d'utiliser une variable différente par fichier que tu utilise pour éviter de les ouvrir plusieurs fois, de les réassigner et de finir dans les choux. En plus de ca tu aura au final un code nettement plus lisible à m on avis.

    voila quelques indices en espérant qu'ils te mettront sur la piste pour corriger ton problème

    Amicalement

    Edit : Ah ben Bleys à répondu avant moi et dans le même sens on dirait ^_^

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Par défaut ça marche !
    ok ! ça marche merci à tous pour votre aide !

    en faite il y avait bien le probleme de la meme variable text utilisé dans la procedure cut, c'est ça qui causait l'erreur entré/sortie !

    et puis le "inc(j)", vous avez raison et c'est juste un oublit...

    merci à tous pour vos réponses rapides malgré mon manque d'expliquation !

    bonne journée !

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

Discussions similaires

  1. Lecture d'un fichier .dbf
    Par San Soussy dans le forum Autres SGBD
    Réponses: 8
    Dernier message: 07/07/2004, 16h30
  2. Réponses: 6
    Dernier message: 02/09/2003, 15h12
  3. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 20h40
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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