このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/580
#  [1] 授業単元:プログラミング演習  
#  [2] 問題文(含コード&リンク) 
#  
#  問題1 テキストファイルのコピーを作るプログラムを作れ 
#  問題2 問題1について下記のようにコピー元とコピー先のファイル名を引数で指定できるようにプログラムを変更せよ
#  
#  ./a. out <コピー元ファイル名> <コピー先ファイル名>


program :-
        user_parameters(L),
        L = [_コピー元ファイル,_コピー先ファイル],
        テキストファイルのコピーを作る(_コピー元ファイル,_コピー先ファイル).

テキストファイルのコピーを作る(_コピー元ファイル,_コピー先ファイル) :-
        入出力ファイルのオープン(_コピー元ファイル,_コピー先ファイル,Instream,Outstream),
        一文字づつコピーする(Instream,Outstream),
        入出力ファイルのオープン(Instream,Outstream),!.
テキストファイルのコピーを作る(_,_).

入出力ファイルのオープン(_コピー元ファイル,_コピー先ファイル,Instream,Outstream) :-
        入力ファイルのオーブン(_コピー元ファイル,Instream),
        出力ファイルのオープン(_コピー先ファイル,Outstream),!.

入力ファイルのオーブン(_コピー元ファイル,Instream) :-
        error_protect(open(_コピー元ファイル,read,Instream),fail),!.
入力ファイルのオーブン(_コピー元ファイル,Instream) :-
        write_formatted('コピー元ファイル %t はオープンてきません\n',[_コピー元ファイル]),
        fail.

出力ファイルのオーブン(_コピー先ファイル,Outstream) :-
        error_protect(open(_コピー先ファイル,write,Outstream),fail),!.
出力ファイルのオーブン(_コピー先ファイル,Outstream) :-
        write_formatted('コピー先ファイル %t はオープンてきません\n',[_コピー先ファイル]),
        fail.

一文字づつコピーする(Instream,Outstream) :-
        at_end_of_stream(Instream),!.
一文字づつコピーする(Instream,Outstream) :-
        get_char(Instream,Char),
        put_char(Outstream,Char),
        一文字づつコピーする(Instream,Outstream).

入出力ファイルのクローズ(Instream,Outstream) :-
        close(Instream),
        close(Outstream),!.