Prolog:获取与at_end_of_stream相比以检查文件结尾

时间:2016-01-15 13:57:21

标签: file prolog eof

我正在使用prolog阅读文件,并想知道说:

的区别
processRead(Stream, ...) :- at_end_of_stream(Stream), !.

processRead(Stream, ...) :- get(Stream, Ch), Ch is -1, !.

有没有?

3 个答案:

答案 0 :(得分:3)

两者都是访问文件内容的极低级别方法,您应该完全使用更好的方法。

在SWI-Prolog中,最优雅的解决方案是:

  1. 撰写描述内容的
  2. 使用Ulrich Neumerkel的library(pio)及其phrase_from_file/2将DCG应用于文件。
  3. 这有几个优点:您可以实际交互式测试DCG,根本不需要文件。该方法是纯粹的,可以在几个方向上应用。等等。

答案 1 :(得分:3)

首先要做的事情!关注@mat's advice

如果你需要选择, 始终更喜欢使用at_end_of_stream/1 而不是get/2

  • get/2 已弃用。如果您有十年前的遗留代码,请迁移它。

    如果您的代码是新的,请不要使用它。决不。甚至没有一次。

  • at_end_of_stream/1标准定义。
  • 几乎每个现代Prolog处理器都支持at_end_of_stream/1 - 包括(但不限于) GNU PrologSICStus PrologSWI PrologB-PrologEclipse CLP

答案 2 :(得分:1)

(来晚会) 我强烈建议您永远使用at_end_of_stream/1。相反,我推荐你的第一种方法,即尝试阅读(使用标准的东西,比如get_code/2),然后检查你是否有文件结束指示符。

  1. 据推测,如果流不在最后,你仍会阅读一个字符,所以你也可以立即阅读它并处理(罕见的)EOF,作为普通字符处理的一部分。 / p>

  2. at_end_of_stream/1被设计破坏,因为它是阻塞的(如果从终端读取,可能会写一个提示)。因此,对于许多种类的流,实际上不可能确定流是否在它的末端,直到它被另一方关闭,这可能永远不会发生。因此,在SICStus Prolog中,at_end_of_stream/1将失败而不是阻止,因此使用at_end_of_stream/1将无法提供您期望的结果。

  3. 因此,总是尝试阅读是最大程度的可移植性,很可能更快,并且不会在某些流上做奇怪的事情。