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 :

[OCaml] Ecrire dans un fichier texte


Sujet :

Caml

  1. #21
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    simple_parsing.ml :

    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
    module Color =
      struct
        let htbl = Hashtbl.create 7
        let of_rgb (r, g, b) = r lsl 16 + g lsl 8 + b
        let to_rgb d = (d lsr 16, (d lsr 8) land 0xFF, d land 0xFF)
        let add color = Hashtbl.add htbl (of_rgb color) ()
        let mem color = Hashtbl.mem htbl (of_rgb color)
        let rem color = Hashtbl.remove htbl (of_rgb color)
        let results() = Hashtbl.fold (fun color _ acc -> (to_rgb color)::acc) htbl []
      end
     
    let parse str =
      Scanf.sscanf str "%d %d %d" (fun r g b -> (r,g,b)) ;;
     
    let input_line ic =
      try Some(input_line ic)
      with End_of_file -> None
     
    let () =
      let ic = open_in "foo.txt" in
     
      let rec read_loop () =
        match input_line ic with
        | Some line ->
            let color = parse line in
            if not(Color.mem color) then Color.add color;
            read_loop ()
        | None ->
            close_in ic;
            (Color.results())
      in
     
      let colors_list = read_loop () in
     
      List.iter (fun (r,g,b) -> Printf.printf "%d %d %d\n" r g b) colors_list;
    ;;
    parsing_scanbuf.ml :

    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
    module Color =
      struct
        let htbl = Hashtbl.create 7
        let of_rgb (r, g, b) = r lsl 16 + g lsl 8 + b
        let to_rgb d = (d lsr 16, (d lsr 8) land 0xFF, d land 0xFF)
        let add color = Hashtbl.add htbl (of_rgb color) ()
        let mem color = Hashtbl.mem htbl (of_rgb color)
        let rem color = Hashtbl.remove htbl (of_rgb color)
        let results() = Hashtbl.fold (fun color _ acc -> (to_rgb color)::acc) htbl []
      end
     
    let p_scanbuf ~f =
      let buf = Scanf.Scanning.from_file "/tmp/foo.txt" in
      let rec loop () =
        if Scanf.Scanning.end_of_input buf then (Color.results())
        else Scanf.bscanf buf " %d %d %d " (fun r g b -> f (r, g, b); loop()) in
      loop ()
     
    let () =
      let f color =
        if not(Color.mem color) then Color.add color;
      in
      let colors_list = p_scanbuf ~f in
     
      List.iter (fun (r,g,b) -> Printf.printf "%d %d %d\n" r g b) colors_list;
    ;;
    no_parsing.ml (hashing full strings) :

    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
    module Color =
      struct
        let htbl = Hashtbl.create 7
        let add color = Hashtbl.add htbl color ()
        let mem color = Hashtbl.mem htbl color
        let rem color = Hashtbl.remove htbl color
        let results() = Hashtbl.fold (fun color _ acc -> color::acc) htbl []
      end
     
    let parse str =
      Scanf.sscanf str "%d %d %d" (fun r g b -> (r,g,b)) ;;
     
    let input_line ic =
      try Some(input_line ic)
      with End_of_file -> None
     
    let () =
      let ic = open_in "foo.txt" in
     
      let rec read_loop () =
        match input_line ic with
        | Some color ->
            if not(Color.mem color) then Color.add color;
            read_loop ()
        | None ->
            close_in ic;
            (Color.results())
      in
     
      let colors_list = List.map parse (read_loop()) in
     
      List.iter (fun (r,g,b) -> Printf.printf "%d %d %d\n" r g b) colors_list;
    ;;
    résultats obtenus avec la commande time :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    simple_parsing.opt   --  01.67 elapsed
    parsing_scanbuf.opt  --  01.24 elapsed
    no_parsing.opt       --  00.30 elapsed
    Avec Scanf.Scanning.from_file on peut effectivement gagner un peu comme tu le prédisais, cependant on est encore loin de la version sans parsing du tout.
    C'est moi qui gagne

  2. #22
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour !

    Citation Envoyé par adtunum
    Oui je suis tout à fait d'accord avec toi, j'avais d'ailleur hésité à poster, cependant ce qui m'avait décidé c'est de voir toutes ces solutions proposées à topgun qui avait l'air d'avoir bien du mal avec ces solutions alors qu'on aurait dut commencer par le point de départ qui est une solution toute simple et facile à appréhender pour un tout jeune débutant.
    Ben comme tu le vois cette discussion n'a pas eu un franc succès puisque le nombre d'intervenants est resté assez faible...

    Citation Envoyé par adtunum
    Avec Scanf.Scanning.from_file on peut effectivement gagner un peu comme tu le prédisais, cependant on est encore loin de la version sans parsing du tout
    Plus exactement, ta version fait le parsing seulement à la fin avec Scanf pour récupérer les composantes et construire la liste des triplets RGB. C'est évidemment plus efficace que de parser avant pour construire l'entier RRGGBB puis le redécouper ensuite (par contre on est probablement gagnant sur le stockage en mémoire en utilisant des entiers). Peut-être une autre solution assez rapide : tout lire, découper en lignes puis construire la table des couleurs. Un début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let read file =
      let ich = open_in file in
      let len = in_channel_length ich in
      let str = String.create len in
      really_input ich str 0 len;
      close_in ich;
      str
    
    let nlines = Str.split (Str.regexp "\n")
    
    let build_table = List.iter (fun x -> if not (Color.mem x) then Color.add x)
    Cordialement,
    Cacophrène

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. lire/ecrire dans un fichier texte
    Par mello dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 13/06/2006, 12h35
  2. [VB.net]ecrire dans un fichier text
    Par grand_prophete dans le forum Windows Forms
    Réponses: 12
    Dernier message: 04/05/2006, 16h37
  3. Réponses: 6
    Dernier message: 17/12/2005, 19h27
  4. [VB.NET] Ecrire dans un fichier texte...
    Par robert.michel9 dans le forum VB.NET
    Réponses: 5
    Dernier message: 04/12/2005, 14h35
  5. Ecrire dans un fichier text en MFC
    Par soufienne dans le forum MFC
    Réponses: 6
    Dernier message: 05/10/2005, 16h54

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