2012-09-22 24 views
12

Tôi có một chức năng loại in_channel -> out_channel -> unit mà sẽ xuất ra một cái gì đó để out_channel. Bây giờ tôi muốn có được đầu ra của nó như là một chuỗi. Tạo các tệp tạm thời để viết và đọc lại nó có vẻ xấu xí, vậy làm thế nào tôi có thể làm điều đó? Có phương pháp nào khác để tạo out_channel bên cạnh Pervasives.open_out gia đình không?Trong OCaml, làm thế nào tôi có thể tạo ra một out_channel ghi vào một chuỗi/bộ đệm thay vì một tập tin trên đĩa

Thực ra, chức năng này đã triển khai repl. Những gì tôi thực sự cần là để kiểm tra nó theo chương trình, vì vậy tôi muốn đầu tiên quấn nó vào một chức năng của loại string -> string. Để tạo in_channel, có vẻ như tôi có thể sử dụng Scanf.Scanning.from_string, nhưng tôi không biết cách tạo tham số out_channel.

+1

Tôi không nghĩ rằng có cách để làm điều này. Nó sẽ là khó khăn, bởi vì các chuỗi có độ dài cố định trong OCaml. Họ không thực sự phù hợp như một nơi mở rộng để lưu trữ các nhân vật. Bạn có thể sử dụng Printf.sprintf để tạo một chuỗi có cùng nội dung mà Printf.fprintf sẽ ghi vào kênh đầu ra. Nhưng ngoài ra, bạn có thể phải xây dựng cơ chế của riêng bạn. –

Trả lời

6

Pin OCaml Bao gồm có output_stringoutput_buffer chức năng trong mô-đun BatIO của nó mà dường như để làm những gì bạn muốn: http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatIO.html

Nó có thể yêu cầu bạn phải sử dụng các loại đầu vào/đầu ra của họ.

+0

dành cho người đọc tương lai, hiện được đặt trong thư viện BatBuffer: http://ocaml-batteries-team.github.io/batteries-included/hdoc2/BatBuffer.html – yago

3

Nếu bạn không nhớ kiểm tra của bạn dựa trên các mô-đun Unix, sau đó bạn có thể sử dụng Unix.pipe để tạo ra một cặp mô tả tập tin, tạo ra một in_channel từ phía có thể đọc được, một out_channel từ phía ghi, và sau đó viết chuỗi đến bên có thể ghi và vượt qua in_channel tới mã đang được kiểm tra.

val pipe : unit -> file_descr * file_descr 

Tạo đường ống. Thành phần đầu tiên của kết quả được mở cho số đọc, đó là lối ra đường ống. Thành phần thứ hai là được mở để viết, đó là lối vào đường ống.

val in_channel_of_descr : file_descr -> Pervasives.in_channel 

Tạo kênh đầu vào đọc từ bộ mô tả đã cho. Kênh ban đầu ở chế độ nhị phân; sử dụng set_binary_mode_in ic sai nếu chế độ văn bản được mong muốn.

val out_channel_of_descr : file_descr -> Pervasives.out_channel 

Tạo kênh đầu ra viết trên bộ mô tả đã cho. Kênh ban đầu ở chế độ nhị phân; sử dụng set_binary_mode_out oc false nếu chế độ văn bản là mong muốn.

Ống Unix có trọng lượng hơi nặng đối với bất kỳ thứ gì có thông lượng cao, nhưng chúng sẽ tốt cho việc khai thác thử nghiệm.

Các vấn đề liên quan