2014-10-19 21 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

但嚴重的是,通過將信息「寫入」列表將會好得多。以這種方式,你也可以爲這部分做一個乾淨的程序。