English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
AW: [Caml-list] laconical input from a file for arrays and/or mat rices
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2004-02-02 (15:33)
From: Khamenia, Valery <V.Khamenia@b...>
Subject: AW: [Caml-list] laconical input from a file for arrays and/or mat rices
Hi Rich and all,

> Probably not quite what you want, but I have a library for reading and
> writing comma-separated values (CSV) files here:
> http://www.merjis.com/developers/csv/
> http://www.merjis.com/developers/csv/ocaml-csv-1.0.1.tar.gz

thank you, it would be interesting what's the skeleton idea 
behind your code, but I can't get it after first apporoach :)

Actually, to emulate behaviour of C++ expression 
"cin >> mydoublevar" I use function cin_float 
instead of read_float:

(* ---------- START -----------*)
exception EOF of string

let max = 4096
let buf = String.create max
and wbuf = Buffer.create 64
and cin_float_i = ref 0 
and cin_float_n = ref 0

let rec scan_words i n inword =
  if i < n then
    let c = buf.[i] in
    if c!=' ' && c!='\n' && c != '\t' then begin
      Buffer.add_char wbuf c;
      scan_words (i + 1) n true
    else if inword then begin
      let word = Buffer.contents wbuf in       
      Buffer.clear wbuf;
      float_of_string word
    else scan_words (i + 1) n false
    let nread = input stdin buf 0 max in
    if nread <> 0 then scan_words 0 nread inword
    else raise (EOF "reading after the end of file");;

let cin_float() = scan_words (!cin_float_i) (!cin_float_n) false;;

   Printf.printf "%f %f " (cin_float()) (cin_float()); 
(* ---------- START -----------*)

However it is error-prone even for single-thread 

Indeed, after call of cin_float some symbols could megrate 
from stdin into the buffer "buf". For this reason in the 
client code after calling "cin_float" the functions like 
"read_float()" will not find all those 
symbols which have been moved into my buffer already.

Decentralized buffers :(

Now, "read_float" is actually a composition:

 float_of_string (read_line())

and "read_line" is just

 flush_stdout; input_line stdin

Thus, to avoid non-decentralized buffers one should 
access stateful "stdin" channel. 
Is "stdin" object in OCaML standardized?..

Maybe you, Rich, have a better idea.

P.S. BTW, I was impressed by a spam level in 
     ocaml-list in Jan 2004. Why posts are not 
     allowed only for a subscribers (or even 
     better for veryfied emails) ?..


To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners