如何在Prolog中读取文件名?

时间:2014-04-24 22:11:17

标签: prolog

这是我需要它进入项目的格式。

Enter file name: filename.txt.

到目前为止我的代码是:

choice(2, X) :- 
  nl, write('\tStore roster to a file:'),nl, write('\tEnter file name: '),read(N),
  open(N,write,Stream), write(Stream, X), write('Roster stored.'),nl,nl,menu(X).

这给出了错误:

ERROR: Stream user_input:21:102 Syntax error: Operator expected

我很感激任何帮助。我在这里尝试做的是获取用户输入文件名然后创建文件并写入列表列表。

2 个答案:

答案 0 :(得分:1)

当我尝试上面的条款时,我得到:

?- choice(2, X).

    Store roster to a file:
    Enter file name: 'filename.txt'.
Roster stored.

我怀疑错误是您没有在单引号之间输入文件名,以确保它将被标准open/3谓词的第一个参数所需的原子读取。

如果您将条款修改为:

choice(2, X) :- 
  nl, write('\tStore roster to a file:'),nl, write('\tEnter file name: '),read(N0),
  term_to_atom(N0,N),
  open(N,write,Stream), write(Stream, X), write('Roster stored.'),nl,nl,menu(X).

然后,您可以不使用单引号:

?- choice(2, X).

    Store roster to a file:
    Enter file name: filename.txt.
Roster stored.

答案 1 :(得分:1)

这是我解决这个问题的方法。新创建的read_string/1按原样读取名称(您不需要使用单引号)。而且我也使用close/1来关闭流,这非常重要,因为没有它,数据可能无法写入磁盘。 (在我的Windows8和SWI-Prolog 6.6.4的情况下,它不是写的。)

read_string(String) :-
    current_input(Input),
    read_line_to_codes(Input, Codes),
    string_codes(String, Codes).

choice(2, X) :-
  nl, write('\tStore roster to a file:'),nl, write('\tEnter file name: '),read_string(N),open(N,write,Stream), write(Stream, X), close(Stream), write('Roster stored.'),nl,nl,menu(X).

更新:

示例输入和输出:

?- choice(2, test).

        Store roster to a file:
        Enter file name: test.txt
Roster stored.

test.txt的内容:test