When reading Prolog clauses from one file, and then writing to another, the latter part can be done using writeclause/2. This is because the clauses are terminated by a period and a newline, which are not retained by prolog. writeclause/2 replaces these, and flushes the output.
writeclause/1,2 knows about the special meaning of ,/2, ;/2, ->/2, fg -->/2 and :-/2 and prints the clause with the appropriate indentation of subgoals and some (redundant) parantheses to show the clause structure. Everything else is written as with writeq/1,2, so output of writeclause/1,2 is readable for read/1,2.
Success:
      ?- writeclause(output, f(1,2,3)), writeclause(output, h(2,3)).
      f(1, 2, 3) .
      h(2, 3) .
      yes.
      ?- writeclause(output, X + 2).
      _56 + 2.
      yes.
      ?- writeclause(output, a(k):-write(k)).
      a(k) :-
              write(k) .
      yes.
      ?- writeclause(output, (a:-write(k),date(K))).
      a :-
              write(k),
              date(_68) .
      yes.
      ?- open(file1,update,s), writeclause(s, X + 2), close(s).
      X = _72
      yes.
      ?- sh('cat file1').
      _72 + 2.
      yes.
      ?- set_stream(a,output), writeclause(a, (:- dynamic f/1)).
      :- dynamic f / 1 .
      yes.
      ?- writeclause(output, (head:-a1,a2;a3,a4->a5;a6)).
      head :-
                (
                    a1,
                    a2
                ;
                    (
                        a3,
                        a4
                    ->
                        a5
                    ;
                        a6
                    )
                ).
      yes.
Error:
      writeclause(S, a(b,c)).         (Error 4).
      writeclause("string" a(b,c)).   (Error 5).