我正在使用prolog阅读文件,并想知道说:
的区别processRead(Stream, ...) :- at_end_of_stream(Stream), !.
和
processRead(Stream, ...) :- get(Stream, Ch), Ch is -1, !.
有没有?
答案 0 :(得分:3)
两者都是访问文件内容的极低级别方法,您应该完全使用更好的方法。
在SWI-Prolog中,最优雅的解决方案是:
phrase_from_file/2
将DCG应用于文件。这有几个优点:您可以实际交互式测试DCG,根本不需要文件。该方法是纯粹的,可以在几个方向上应用。等等。
答案 1 :(得分:3)
首先要做的事情!关注@mat's advice!
如果你需要选择,
始终更喜欢使用at_end_of_stream/1
而不是get/2
!
get/2
已弃用。如果您有十年前的遗留代码,请迁移它。
如果您的代码是新的,请不要使用它。决不。甚至没有一次。
at_end_of_stream/1
由iso-prolog标准定义。at_end_of_stream/1
- 包括(但不限于)
GNU Prolog,SICStus Prolog,SWI Prolog,B-Prolog和Eclipse CLP。答案 2 :(得分:1)
(来晚会)
我强烈建议您永远使用at_end_of_stream/1
。相反,我推荐你的第一种方法,即尝试阅读(使用标准的东西,比如get_code/2
),然后检查你是否有文件结束指示符。
据推测,如果流不在最后,你仍会阅读一个字符,所以你也可以立即阅读它并处理(罕见的)EOF,作为普通字符处理的一部分。 / p>
at_end_of_stream/1
被设计破坏,因为它是阻塞的(如果从终端读取,可能会写一个提示)。因此,对于许多种类的流,实际上不可能确定流是否在它的末端,直到它被另一方关闭,这可能永远不会发生。因此,在SICStus Prolog中,at_end_of_stream/1
将失败而不是阻止,因此使用at_end_of_stream/1
将无法提供您期望的结果。
因此,总是尝试阅读是最大程度的可移植性,很可能更快,并且不会在某些流上做奇怪的事情。