打开空文件后end_of_stream属性的合规性判定问询
问题场景
在包含空文件empty的目录中执行以下Prolog查询:
?- member(EOF_action,[error,eof_code,reset]), open(empty,read,S,[eof_action(EOF_action)]), stream_property(S,end_of_stream(EOS)), close(S).
不同Prolog系统返回的EOS结果如下:
| Prolog系统 | eof_action(error) | eof_action(eof_code) | eof_action(reset) |
|---|---|---|---|
| SICStus Prolog | not | not | not |
| GNU Prolog | at | at | not |
| Scryer Prolog | at | at | at |
| Traella Prolog | at | at | not |
| SWI-Prolog | not | not | not |
各系统在此边缘场景中的表现差异显著,请问ISO-Prolog标准是否明确了合规处理器的正确行为?
回答
ISO-Prolog标准对该场景的行为有明确规定。依据ISO/IEC 13211-1:1995的相关条款:
- 当打开空文本流用于读取时,流的初始结束状态即为
at(位于文件末尾),该状态与eof_action选项的设置无关。
标准明确说明,流的结束状态由当前位置决定,空文件打开后,当前位置直接处于文件末尾,因此stream_property(S, end_of_stream(EOS))必须返回EOS = at。
eof_action选项的作用是控制后续尝试从已处于EOF状态的流读取数据时的行为,而非改变流打开时的初始EOF状态。那些返回not的系统不符合ISO标准的要求。
内容的提问来源于stack exchange,提问作者repeat
相关产品推荐
相关产品推荐

