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

Pascal Discussion :

Problème de lecture de fin de fichier (eof(fichier))


Sujet :

Pascal

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème de lecture de fin de fichier (eof(fichier))
    Bonjour à tous... voila après maints et maints essais, je me vois dans l'obligation de venir sur mon gentil forum informatique vous exposer mon problème... Effectivement, je dois copier le contenu d'un fichier texte dans un tableau de strings... Je voudrais qu'à chaque mot contenu dans le fichier soit allouée une case... Je vous entends déjà dire d'ici que c'est facile... mais pour un apprenti en programmation de 16 ans c'est déjà assez compliqué... Voici donc mon code, le problème est qu'il ne lit pas le dernier mot du fichier et donc ne lui alloue aucune case... J'ai aussi inclus un "write" qui permet de voir ce que contient vraiment le fichier... :
    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
    56
    57
    58
    59
    60
    61
    program test;
    uses sysutils,crt;
    const EMPLACEMENTFICHIER='C:\programmation\fichier.txt';
     
    type
    recordrecherche = record
               mot : string;
               numligne : integer;
               numposmot : integer;
    end;
     
    tableau1 = array[1..1000000] of string;
    tableau2 = array[1..1000000] of recordrecherche;
     
    var car:char;
        temporaire:string;
        fichier: text;
        tableaurecherche:tableau1;
        tableaurecit:tableau2;
        compteurmot:integer;
         ok:boolean;
     
     
    begin
     
     
        assign (fichier, EMPLACEMENTFICHIER);
        reset(fichier) ;
        compteurmot:=1;
     
        while ( not(eof(fichier) ) ) do
     
        begin
     
         read(fichier, car);
     
     
             while   (car <> ' ' )  do
     
                   begin
     
                   temporaire:= (temporaire+car);
                   read (fichier, car);
     
     
     
                   end;
     
     
     
                   tableaurecherche[compteurmot]:=(temporaire);
                   temporaire:=('');
                   writeln(tableaurecherche[compteurmot]);  //pour verifier que le tableau est initialisé//
                   compteurmot:=(compteurmot+1);
     
     
        end;
     
        close(fichier);
     
    end.
    Ca c'est pour le premier programme qui copie le fichier en un tableau de strings... Et voici mon deuxième code qui, lui, copie le contenu d'un fichier de texte, dans un tableau de records à 3 champs (un champ de mot : string, un champ de position de mot (pour savoir sa place dans la ligne) et un champ de numéro de ligne pour savoir à quelle ligne il est dans le texte ) et là le problème est plus ou moins similaire... Disons que j'aimeraiq savoir ce qui cloche... en sachant qu'il faut absolument que cela m'affiche le mot, sa position dans la ligne et le numéro de sa ligne... d'où l'usage de 2 compteurs, un qui s'incrémente avec le eoln (end of line) pour savoir quand on passe à une autre ligne... (mais mon end of line ne fonctionne pas)... Enfin le voici, votre aide sera précieuse et me permettrait d'avancer... :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    program test;
    uses sysutils,crt;
    const EMPLACEMENTFICHIER='C:\Documents and Settings\Gilles\Mes documents\Mes fichiers reçus\fichier.txt';
     
    type
    recordrecherche = record
               mot : string;
               numligne : integer;
               numposmot : integer;
    end;
     
    tableau1 = array[1..1000000] of string;
    tableau2 = array[1..1000000] of recordrecherche;
     
    var car:char;
        temporaire:string;
        fichier: text;
        tableaurecherche:tableau1;
        tableaurecit:tableau2;
        compteurmot:integer;
        compteurligne,avancementtableau:integer;
     
     
     
     
    begin
     
     
        assign (fichier, EMPLACEMENTFICHIER);
        reset(fichier) ;
        compteurmot:=1;
        compteurligne:=1;
        avancementtableau:=1;
     
        while ( not(eof(fichier) ) ) do
     
        begin
     
     
             read(fichier, car);
     
             while  (car <> ' ' ) do
     
                   begin
     
                   temporaire:= (temporaire+car);
                   read (fichier, car);
     
     
                   end;
     
                   if (eoln(fichier)) then begin
                                           compteurligne:=(compteurligne+1);
                                           compteurmot:=1;
                                           end;
     
                   tableaurecit[avancementtableau].mot:=(temporaire);
                   tableaurecit[avancementtableau].numligne:=(compteurligne);
                   tableaurecit[avancementtableau].numposmot:=(compteurmot);
                   temporaire:=('');
                   write(tableaurecit[avancementtableau].mot);
                   write('  ');write(tableaurecit[avancementtableau].numposmot);
                   write('  ');writeln(tableaurecit[avancementtableau].numligne);
                   compteurmot:=(compteurmot+1);
                   avancementtableau:=(avancementtableau+1);
     
     
        end;
     
        close(fichier);
     
     
     
    end.

    Merci à tous pour votre attention, au plaisir de vous lire, Julien.

  2. #2
    Membre habitué Avatar de arnobase
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 133
    Points
    133
    Par défaut
    Et si tu remplaces

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (not(eof(fichier))) do
    ...
    end;
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Repeat 
    ...
    Until (eof(fichier));
    .
    La vie est un long torrent tranquile...

  3. #3
    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 845
    Points
    4 845
    Par défaut
    Alors quelques remarque sur la présentation d'abord :

    Pour poster ton code, préfères utiliser les balises code (le # ou [ code ][ /code ] en enlevant les espace) : ça garde l'indentation (s'il y'en avait une, ce qui serait mieux ^^) et ça fait de la coloration syntaxique.

    Pour tes tableaux, il serait plus judicieux d'utiliser des listes chaînées (des pointeurs), qui allouent dynamiquement de l'espace, au lieu de réserver 2*1 000 000 de String.

    Les noms de tes variables "tableaurecherche" et "tableaurecit" portent un peu à confusion car elle sont associées respectivement aux types "array[1..1000000] of string" et "array[1..1000000] of recordrecherche". Bon, c'est pas bien grave, je te l'accorde.

    Dernière chose sur la présentation : inutile de mettre autant de parenthèses, ça rend le code plus difficile à lire.
    Les parenthèses ne sont utiles que pour distinguer les priorités dans les opérations logiques ou arithmétiques (pour l'oeil humain ou pour le compilateur), et pour les procédures/fonctions.

    Maintenant pour le code :
    - tu as oublié d'initialiser la variable temporaire, ce qui peut provoquer des comportements incohérents.
    - tu ne testes pas la fin du fichier dans ta deuxième boucle, ce qui doit être la cause de ton problème.

    Donc, pour régler ce problème, tu peux simplement te passer de ta 2ième boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    temporaire := ''; // initialisation de temporaire
    while (not eof(Fichier)) do
    begin
      read(car);
      if (eoln(Fichier) or eof(Fichier) or car = ' ') do // si c'est une fin de ligne ou du fichier ou un espace
      begin
        // ton traitement lors d'un nouveau mot
        temporaire := ''; // reinitialisation de temporaire
      end;
      else // on est toujours dans le meme mot
        temporaire := temporaire+car;
    end;
    Voilà, réessaye avec ça.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/06/2008, 11h48
  2. [POI] Problème de lecture des fichiers Word
    Par Dari dans le forum Documents
    Réponses: 9
    Dernier message: 05/07/2007, 14h08
  3. Réponses: 2
    Dernier message: 02/11/2006, 21h35
  4. Problème de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 00h13
  5. Problème de lecture de fichier Oracle 9.2
    Par fortlow dans le forum Oracle
    Réponses: 4
    Dernier message: 14/11/2005, 16h48

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