Browse thread
AW: [Caml-list] laconical input from a file for arrays and/or mat rices
- Khamenia, Valery
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ 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 end else if inword then begin let word = Buffer.contents wbuf in Buffer.clear wbuf; cin_float_i:=i+1; cin_float_n:=n; float_of_string word end else scan_words (i + 1) n false else 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;; (* test: Printf.printf "%f %f " (cin_float()) (cin_float()); *) (* ---------- START -----------*) However it is error-prone even for single-thread applications. 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) ?.. -- vak ------------------- 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