如何处理SWI-Prolog中`user_input`或`user_output`的二进制数据?

时间:2015-08-29 20:24:16

标签: io prolog swi-prolog

我想在Prolog中编写一个处理二进制数据的程序。它应以UNIX方式运行,即如果没有给出参数,则应从stdin / user_input读取并写入stdout / user_output以充当管道中过滤

只要我的数据是文本的,一切都运行正常,但是一旦我的数据是二进制的,输出就很奇怪而且完全不符合我的预期,有时我得到像Illegal multibyte Sequence这样的奇怪消息。使用open/3打开的流也是如此。

1 个答案:

答案 0 :(得分:2)

默认情况下,user_inputuser_output设置为type(text)encoding(X),其中X是从环境派生的平台的编码。如果要处理二进制数据,则需要将流的类型更改为type(binary)或将流的编码更改为encoding(octet)。您可以使用set_stream/2执行此操作,如下所示:

:- set_stream(user_input, type(binary)).
:- set_stream(user_output, type(binary)).

:- set_stream(user_input, encoding(octet)).
:- set_stream(user_output, encoding(octet)).

对于您自己打开的流,您也可以使用open(Filename, read, StreamIn, [type(binary)] )或{{1}来使用open/4。 }的 open(Filename, read, StreamIn, [encoding(octet)]

当您正在阅读的内容实际上是二进制数据时,)是首选方法。