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

Caml Discussion :

Problème de lecture d'un fichier


Sujet :

Caml

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 19
    Points
    19
    Par défaut Problème de lecture d'un fichier
    Bonjour à tous,
    Je sais que c'est un mauvais timing à cause des fêtes mais cela fait 15 jours que je bloque sur une fonction qui doit lire un fichier jusqu'à End_of_file et enregistrer chaque ligne dans une liste j'ai alors utilisé cette fonction :

    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
     
     
    let ouverture  = function nom_fichier -> 
    	open_in ("/home/Bureau/"^(nom_fichier)^".QT") ;;
     
     
    let recup nom_fichier l =
      let ic = ouverture nom_fichier in
      let rec recup_rec () l =
        try
    	let a = input_line ic in
          (a::l);
          recup_rec () l;
        with End_of_file -> close_in ic 
      in recup_rec () l ;;
    le problème est que lors de la compilation ocaml me dit que (a::l) doit avoir le type unit alors que input_line prend un in_channel et renvoie un string et que ma liste est vide initialement donc elle est du type 'a list donc normalement a::l ne devrait pas poser de problème si quelqu'un a une solution je suis volontier preneur s'il vous plaît !
    Bonne journée et bonnes fêtes !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 87
    Points : 172
    Points
    172
    Par défaut
    Le code que vous avez fourni n'a pas de problème de compilation chez moi mais il n'en demeure pas moins qu'il est truffé de problèmes.

    Le plus gros problème est très simple. OCaml est un langage avec des types persistants, c'est à dire que les structures de ce type ne sont pas directement modifié (ce qu'on voit très bien en maths, par exemple, car quand on écrit 2 + 1, on obtient un nouveau nombre, 3, ce n'est pas 2 ou 1 qui sont transformés en 3). L'opérateur :: prend donc un élément e de type 'a et une liste d'éléments l du même type 'a et renvoie une nouvelle liste composé de e et l. Cet opérateur ne modifie pas l.

    Or vous écrivez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let recup nom_fichier l =
      let ic = ouverture nom_fichier in
      let rec recup_rec () l =
        try
          let a = input_line ic in
          (a::l);
          recup_rec () l;
        with End_of_file -> close_in ic 
      in recup_rec () l ;;
    Si on regarde bien la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let a = input_line ic in
    (a::l);
    recup_rec () l;
    on voit bien que vous considérez (a::l) comme une instruction (donc une expression qui ne renvoie rien ou expression qui ne fait que des effets de bord ou expression de type unit, vous l'appelez comme vous voulez) puis vous rappelez recup_rec () l en pensant que l a été modifiée.

    Voici un code qui devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let recup nom_fichier l =
      let ic = ouverture nom_fichier in
      let rec recup_rec l =
        try
          let a = input_line ic in
          recup_rec (a::l)
        with End_of_file -> close_in ic ; l
      in recup_rec [];;
    J'ai changé plusieurs choses dans votre code car même avec ma modification il n'aurait pas fonctionné.
    • Pas besoin du paramètre ()
    • Lorsqu'on rencontre End_of_file il faut non seulement fermer le canal de lecture mais aussi renvoyer la liste
    • Après avoir défini recup_rec vous l'appelez sur l sauf que l n'existe pas, il faut l'appeler sur la liste vide []


    Bon courage pour la suite.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Ah mais oui c'est vrai (j'ai honte de ce que j'ai fait ) j'étais tellement dans mon code que je n'ai pas pris de recul dessus et donc une erreur aussi bête m'a échappé et effectivement cela fonctionne mieux comme ça !
    Merci beaucoup de votre réponse et d'avoir pris de votre temps !
    Bonne journée à vous

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

Discussions similaires

  1. [VBnet] Problème de lecture d'un fichier texte.
    Par dibeloni dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2006, 19h12
  2. [VB6] Problème de lecture d'un fichier excel
    Par Requin15 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/03/2006, 17h10
  3. Problème de lecture d'un fichier
    Par rvweb dans le forum C++
    Réponses: 3
    Dernier message: 30/12/2005, 21h03
  4. Réponses: 2
    Dernier message: 28/12/2005, 15h00
  5. Problème de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 00h13

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