Проблемы с записью в файл

#prolog

#пролог

Вопрос:

У меня есть несколько кодов prolog, я печатаю процессы на терминале. Также я записываю в файл то, что печатаю на терминале. Я помещаю функции записи в файл рядом с каждой функцией записи. Но это не одно и то же. Запись файла не работает должным образом.

 printrow([]) :- write('  '),
    open('output.txt',append,OS), write(OS,'  '), close(OS).
    % I try to put same process for file
printrow([X|Xs]) :- printrepl(X,Y), write(' '), write(Y),               
    printrow(Xs), open('output.txt', append,OS),
    write(OS,' '), write(OS,Y), close(OS).

printrepl(' ',' ') :- !.
printrepl(x,'X').

printrows([]) :- nl.
printrows([N|Ns]) :- write(N), write(' '),
    open('output.txt', append,OS), write(OS,N), write(OS,' '),  
    printrows(Ns), write(OS,' n'), close(OS).
   
% I can't find alternative for writef('%2r w',[X]) below, 
% for writing file, I think there is bug

writek(K,List) :- nth1(K,List,X), !, writef('%2r w',[X]),
    open('output.txt',append,OS), write(OS,' '), write(OS,X), close(OS).
writek(_,_) :- write('  '),
    open('output.txt',append,OS),write(OS,'  '), close(OS).
 

Можете ли вы дать мне совет по написанию тех же выходных данных с помощью терминала?

Комментарии:

1. Вы говорите: «Я не могу найти альтернативу для writef(‘%2r w’,[X])»: вам следует переключиться с writef (устаревшего) на format (см. Этот небольшой обзор ). Вы также должны открыть файл один раз при начале обработки и закрыть после завершения, а не открывать / закрывать его при каждом выходе (хотя единственный вред в этом заключается в том, что ОС больше работает). Но что именно не работает?

2. Я печатаю несколько цифр с цифрами, на терминале это печатается правильно, но когда дело доходит до файловой части, возникают некоторые дополнительные пробелы. @DavidTonhofer

Ответ №1:

Вот перезапись для writek и printrows . Это может быть полезно.

 % ---
% Printing rows (as "~w", equal to write/1) to stream Stream
% --- 

printrows([],Stream) :-
   format(Stream,"~n",[]).

printrows([N|Ns],Stream) :-
   format(Stream,"~w ~n",[N]),
   printrows(Ns,Stream).
   
% ---
% Printing/Appending Rows to the file named by Filename
% ---

printrows_to_file(Filename,Rows) :-
   setup_call_cleanup(
      open(Filename, append, Stream), % NB append
      printrows(Rows,Stream),
      close(Stream)).

% ---
% Printing Rows to stdout
% ---
      
printrows_to_stdout(Rows) :-
   printrows(Rows,user_output).
   
% ---
% Write "w", indented by 1-based value of List[K]
% ---

writek(K,List,Stream) :-
   nth1(K,List,Element),
   !,
   forall(between(1,Element,_),format(Stream," ",[])), % Indent
   format(Stream,"w~n",[]).

writek_to_file(Filename,K,List) :-
   setup_call_cleanup(
      open(Filename, append, Stream), % NB append
      writek(K,List,Stream),
      close(Stream)).

writek_to_stdout(K,List) :-
      writek(K,List,user_output).
 

Например:

 ?- printrows_to_stdout([1,2,3]). 
1 
2 
3 

true.

?- writek_to_stdout(1,[4,5,6]).
    w
true.
 

Аналогично для

 ?- printrows_to_file('filename.txt',[1,2,3]).
?- writek_to_file('filename.txt',1,[4,5,6]).