このディレクトリの索引
#  
#  行読み込み述語 get_line/2,get_line/1 です。
#  ここでの焦点は改行なしにいきなりEOFが来た時の処理。
#  at_end_of_stream で処理をするのですが、最後の文字として、
#  改行があったのかどうかを返すことはできません。
#  
%  
%  get_chars/2 : get_chars(_ファイル,_文字リスト)
%       ファイル全体をリストとして取得します
%  

get_chars(File,Chars) :-
        open(File,read,Instream),
        get_chars_1(Instream,Chars),
        close(Instream).

get_chars_1(Instream,[]) :-
        at_end_of_stream(Instream),!.
get_chars_1(Instream,[Char|R]) :-
        get_char(Instream,Char),
        get_chars_1(Instream,R).

%  
%  get_lines/2 : get_lines(_ファイル名,_行リスト)
%       ファイル全体を行のリストとして取得します
%       第一引数はストリームではなくファイルです
%  

get_lines(File,Lines) :-
        open(File,read,Instream),
        get_lines_1(Instream,Lines),
        close(Instream).

get_lines_1(Instream,[]) :-
        at_end_of_stream(Instream),!.
get_lines_1(Instream,[Line|R]) :-
        get_line(Instream,Line),
        get_lines_1(Instream,R).

%  
%  get_line/2 : get_line(_ストリーム,_行)
%       改行がくるまで、アトムとして取得します
%  

get_line(Stream,end_of_file) :-
        at_end_of_stream(Stream),!.
get_line(Stream,X) :-
        get_char(Stream,C),
        get_line_1(Stream,C,Chars),
        atom_chars(X,Chars).

get_line_1(Stream,C,[C]) :-
        at_end_of_stream(Stream),!.
get_line_1(Stream,'\n',[]) :- !.
get_line_1(Stream,C,[C|R]) :-
        get_char(Stream,C2),
        get_line_1(Stream,C2,R).

%  
%  標準入力の場合。
%  

get_line(X) :-
        current_input(Stream),
        get_line(Stream,X).