2014-10-19 63 views
2
写入到文件

您好我有以下代码:在序言

show_result(Squares,MaxRow,MaxCol) :- 
    show_result(Squares,MaxRow,MaxCol,1), nl. 

show_result(_,MaxRow,_,Row) :- Row > MaxRow, !. 
show_result(Squares,MaxRow,MaxCol,Row) :- 
    show_result(Squares,MaxRow,MaxCol,Row,1), nl, 
    Row1 is Row+1, show_result(Squares,MaxRow,MaxCol,Row1). 

show_result(_,_,MaxCol,_,Col) :- Col > MaxCol, !. 
show_result(Squares,MaxRow,MaxCol,Row,Col) :- 
    (memberchk(sq(Row,Col,X),Squares), !, write(X); write('#')), 
    Col1 is Col+1, show_result(Squares,MaxRow,MaxCol,Row,Col1). 

当我运行代码,它在屏幕上显示正确的输出。

但我想它写了,我已经以这种方式修改的代码的文件:

show_result(Squares,MaxRow,MaxCol,SolutionFile) :- 
    show_result(Squares,MaxRow,MaxCol,1,SolutionFile), 
    open(SolutionFile,write,Stream), 
    nl(Stream), close(Stream). 

show_result(_,MaxRow,_,Row,SolutionFile) :- Row > MaxRow, !. 
show_result(Squares,MaxRow,MaxCol,Row,SolutionFile) :- 
    show_result(Squares,MaxRow,MaxCol,Row,1,SolutionFile), 
    open(SolutionFile,write,Stream),nl(Stream), close(Stream), 
    Row1 is Row+1, 
    show_result(Squares,MaxRow,MaxCol,Row1,SolutionFile). 

show_result(_,_,MaxCol,_,Col,SolutionFile) :- Col > MaxCol, !. 
show_result(Squares,MaxRow,MaxCol,Row,Col,SolutionFile) :- 
    ( memberchk(sq(Row,Col,X),Squares), 
     !, 
     open(SolutionFile,write,Stream), write(Stream,X), close(Stream) 
    ; open(SolutionFile,write,Stream), write(Stream,'#'), close(Stream) 
    ), 
    Col1 is Col+1, 
    show_result(Squares,MaxRow,MaxCol,Row,Col1,SolutionFile). 

这个返回“true”,但并不写入任何文件。 我需要更改哪些内容才能将输出写入文件?

回答

0

虽然这看起来效率太低,但可以尝试将打开/ 3模式从write更改为append

更好的办法是传递文件描述符而不是SolutionFile。所以我建议

show_result(Squares,MaxRow,MaxCol,SolutionFile) :- 
    open(SolutionFile,write,Stream), 
    show_result(Squares,MaxRow,MaxCol,1,Stream), 
    nl(Stream), close(Stream). 

,并从这些谓词删除所有其他开放/ 3,书面而非为SolutionFile

how_result(_,MaxRow,_,Row,SolutionFile) :- Row > MaxRow, !. 
show_result(Squares,MaxRow,MaxCol,Row,SolutionFile) :- 
    show_result(Squares,MaxRow,MaxCol,Row,1,SolutionFile), 
    nl(SolutionFile), 
    Row1 is Row+1, 
    show_result(Squares,MaxRow,MaxCol,Row1,SolutionFile). 

show_result(_,_,MaxCol,_,Col,SolutionFile) :- Col > MaxCol, !. 
show_result(Squares,MaxRow,MaxCol,Row,Col,SolutionFile) :- 
    ( memberchk(sq(Row,Col,X),Squares), 
     !, 
     write(SolutionFile,X) 
    ; write(SolutionFile,'#') 
    ), 
    Col1 is Col+1, 
    show_result(Squares,MaxRow,MaxCol,Row,Col1,SolutionFile). 

注:未经测试的代码。

既然你提到输出已经是正确的,在SWI-Prolog中可用的另一种方法是保持origincal程序不变,并使用with_output_to来调用它。

另一种替代方法是使用旧式IO,使用tell/1前缀执行,并在执行tell/0后恢复。但这种方式的IO不推荐使用,因为它会导致一些困难......

+0

我只是改变了“写”到“追加”,它工作得很好。写基本上覆盖已写入的文件。因此,最终的产出没有任何内容。改变它追加工作正常。 – 2014-10-19 12:21:10

1

使用原来的程序和:

..., once_to_file(show_result(Squares,MaxRow,MaxCol)), ... 

once_to_file(Goal, File) :- 
    open(File, write, S), 
    with_output_to(S,once(Goal)), 
    close(S). 

这可以进一步提高使用setup_call_cleanup/3

但严重的是,通过将信息“写入”列表将会好得多。以这种方式,你也可以为这部分做一个干净的程序。